大臣的旅费

    xiaoxiao2021-03-25  104

    思路:

    给出的一棵树,只要找到两个距离最大的节点就可以了。两遍搜

    #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include <vector> #include <iostream> using namespace std; int ans1,max1,ans2,max2; int n; const int maxn=100005; vector< pair<int,int> >vec[maxn]; int vis[maxn]; void dfs(int x,int num) { if(num>max1) { max1=num; ans1=x; } for(int i=0;i<vec[x].size();i++) { int v=vec[x][i].first,w=vec[x][i].second; //cout<<x<<" "<<v<<" "<<num<<endl; if(!vis[v]) { vis[v]=1; dfs(v,num+w); vis[v]=0; } } } void dfs2(int x,int num) { if(num>max2) { max2=num; ans2=x; } for(int i=0;i<vec[x].size();i++) { int v=vec[x][i].first,w=vec[x][i].second; if(!vis[v]) { vis[v]=1; dfs2(v,num+w); vis[v]=0; } } } int main() { scanf("%d",&n); for(int i=0;i<=n;i++) { vec[i].clear(); vis[i]=0; } ans1=0,max1=0,ans2=0,max2=0; for(int i=1;i<n;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); vec[--u].push_back( make_pair(--v,w) ); vec[v].push_back(make_pair(u,w) ); } vis[0]=1; dfs(0,0); memset(vis,0,sizeof(vis)); vis[ans1]=1; dfs2(ans1,0); printf("%d",(1+max2)*max2/2+max2*10); }

    转载请注明原文地址: https://ju.6miu.com/read-17972.html

    最新回复(0)