[蓝桥杯][2013年第四届真题]大臣的旅费

    科技2022-07-10  109

    题目链接:大臣的旅费

    解题思路:这是一个树,求路费最多。在树中,任意两个点的最长路径是树的直径,求树的直径就是答案,最后的路费:假设走了4千米,那么答案为50(11+12+13+14),可以看出路长x,则路费为 x ∗ 10 + ( 1 + 2 + . . . + x − 1 + x ) = > x ∗ 10 + ( x + 1 ) ∗ x / 2 x*10+(1+2+...+x-1+x)=>x*10+(x+1)*x/2 x10+1+2+...+x1+x)=>x10+(x+1)x/2

    树的最长直径:先随便找一个点x,从该点开始搜,然后找到与这个点最远的点y,再从点y开始搜,找到与点y最远的点z,则y到z就是路的直径

    #include<bits/stdc++.h> #define x first #define y second #define mem(h) memset(h,-1,sizeof h) #define mcp(a,b) memcpy(a,b,sizeof b) using namespace std; typedef long long LL; typedef unsigned long long ull; typedef pair<int,int>PII; typedef pair<double,double>PDD; namespace IO{ inline LL read(){ LL o=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();} return o*f; } }using namespace IO; //#############以上是自定义技巧(可忽略)########## const int N=1e5+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e9+7,P=131; int h[N],e[M],w[M],ne[M],idx; int dist[N]; int n; void add(int a,int b,int c){ e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++; } void dfs(int u,int fa,int d){//u表示当前点,fa表示当前点的父节点,d表示到当前点的距离 dist[u]=d; for(int i=h[u];~i;i=ne[i]){ int j=e[i]; if(j==fa)continue;//如果是父节点就跳过 dfs(j,u,d+w[i]); //去搜下一个相通的点 } } int main(){ cin>>n; mem(h); for(int a,b,c,i=0;i<n-1;i++){ cin>>a>>b>>c; add(a,b,c),add(b,a,c);//建边 } dfs(1,-1,0);//从1开始搜 int u=1; for(int i=2;i<=n;i++){ if(dist[u]<dist[i]){//找与1最远的点 u=i; } } dfs(u,-1,0);//再从这个点开始搜 for(int i=1;i<=n;i++){ if(dist[u]<dist[i]){//找到与这个点最远的点 u=i; } } cout<<dist[u]*10+(dist[u]+1ll)*dist[u]/2<<endl; return 0; }
    Processed: 0.024, SQL: 8