题意:给你一棵树,每条边都有权值,给你两个人去遍历这棵树,问将这棵树遍历完的最小代价是多少,给定两个人的起点,两个人不一定要回到起点。
求出所有的边的权值和,然后减去树的直径就可以了。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=100005; struct Edge { int v,w; Edge* nxt; }memo[N*2],*cur,*adj[N]; int dis[N]; void dfs(int u,int fa,int valu) { for(Edge* it=adj[u];it;it=it->nxt) { int v=it->v,w=it->w; if(v==fa) continue; dfs(v,u,dis[v]=valu+w); } } void addEdge(int u,int v,int w) { cur->v=v; cur->w=w; cur->nxt=adj[u]; adj[u]=cur++; } void init() { cur=memo; memset(adj,0,sizeof(adj)); } int main() { int n,s; while(scanf("%d%d",&n,&s)!=EOF) { init(); int sum=0,ind=1; for(int i=0;i<n-1;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); sum+=2*w; addEdge(u,v,w); addEdge(v,u,w); } dfs(s,-1,dis[s]=0); for(int i=2;i<=n;i++) if(dis[ind]<dis[i]) ind=i; dfs(ind,-1,dis[ind]=0); for(int i=1;i<=n;i++) if(dis[ind]<dis[i]) ind=i; printf("%d\n",sum-dis[ind]); } return 0; }