POJ 1849 Two

来源:互联网 发布:日本汽车出口数据 编辑:程序博客网 时间:2024/06/07 10:28

传送门

题目大意:自行参考

题解:

exm???

如果必须回到根结点那么答案就是边权之和的两倍。

注意到两个人肯定是走到叶子结点,这样就少走了两人之间的链长的距离。

所以要最大化链长,所以就是求直径。

答案就是边权之和的两倍减去直径长度即可。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#define MAXN 100010using namespace std;struct node{int to,wgt;node(int _t,int _w){to=_t;wgt=_w;}};vector<node> g[MAXN];int d1[MAXN],d2[MAXN],maxd;int getdp(int s,int fa){d1[s]=d2[s]=0;for(int i=g[s].size()-1;i>=0;i--)if(g[s][i].to!=fa){getdp(g[s][i].to,s);d2[s]=max(d2[s],d1[g[s][i].to]+g[s][i].wgt);if(d2[s]>d1[s]) swap(d1[s],d2[s]);}maxd=max(maxd,d1[s]+d2[s]);return 0;}int main(){int n,s,tot;while(scanf("%d%d",&n,&s)!=EOF&&(n||s)){maxd=tot=0;for(int i=1;i<=n;i++) g[i].clear();for(int i=1;i<n;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);g[u].push_back(node(v,w));tot+=w;g[v].push_back(node(u,w));tot+=w;}getdp(s,0);printf("%d\n",tot-maxd);}return 0;}