hdu 3848 CC On The Tree

来源:互联网 发布:snow拍照软件下载 编辑:程序博客网 时间:2024/05/17 22:46

寻找两个叶子结点最近的距离为多少

#include <cstdio>#include <cstring>#define INF 20000000int cnt;int head[10010],next[20010][3],dp[10010][2];void add(int u,int v,int w){    next[cnt][1]=v;    next[cnt][2]=w;    next[cnt][0]=head[u];    head[u]=cnt++;}int min(int x,int y){    return x>y?y:x;}void trajan(int cur,int fa){    int flag=0;    for(int i=head[cur];i!=-1;i=next[i][0])    {        int v=next[i][1];        if(v!=fa)        {            ++flag;            trajan(v,cur);            int sum=next[i][2]+dp[v][0];            if(sum<dp[cur][0])            {                dp[cur][1]=dp[cur][0];                dp[cur][0]=sum;            }            else if(dp[cur][1]>sum) dp[cur][1]=sum;        }    }    if(!flag) dp[cur][0]=0;    if(fa==-1&&flag==1) cnt=min(cnt,dp[cur][0]);    cnt=min(cnt,dp[cur][0]+dp[cur][1]);}int main(){   // freopen("in.txt","r",stdin);    int n;    while(scanf("%d",&n)!=EOF)    {        if(!n) break;        for(int i=0;i<=n;++i) head[i]=-1,dp[i][0]=dp[i][1]=INF;        int u,v,w;        cnt=0;        for(int i=0; i<n-1; ++i)        {            scanf("%d%d%d",&u,&v,&w);            add(u-1,v-1,w);            add(v-1,u-1,w);        }        cnt=INF;        trajan(0,-1);        printf("%d\n",cnt);    }    return 0;}