poj 1849 Two

/*poj 1849 two 思考一下会发现 就是求直径 直径上的中点就是两个人分开的地方(不再有交集)*/
#include<cstdio>
#define maxn 100010
using namespace std;
int n,num,head[maxn],root,f[maxn][2],sum,M;
struct node{
    int v,t,pre;
}e[maxn*2];
int init(){
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
int max(int x,int y){
    return x>y?x:y;
}
void Add(int from,int to,int dis){
    num++;e[num].v=to;
    e[num].t=dis;
    e[num].pre=head[from];
    head[from]=num;
}
void Cl(){
    num=M=sum=0;
    for(int i=1;i<=n;i++)
        head[i]=f[i][0]=f[i][1]=0;
}
void Dfs(int now,int from){
    for(int i=head[now];i;i=e[i].pre){
        int v=e[i].v;if(v==from)continue;
        Dfs(v,now);
    }
    int mx=0,mxx=0;
    for(int i=head[now];i;i=e[i].pre){
        int v=e[i].v;if(v==from)continue;
        int Mx=f[v][0]+e[i].t;
        if(Mx>mx)mxx=mx,mx=Mx;
        else if(Mx>mxx)mxx=Mx;
    }
    f[now][0]=mx;f[now][1]=mxx;
}
int main()
{
    while(~scanf("%d%d",&n,&root)){
        Cl();
        int u,v,t;
        for(int i=1;i<n;i++){
            u=init();v=init();t=init();
            Add(u,v,t);Add(v,u,t);sum+=t;
        }
        Dfs(root,0);
        for(int i=1;i<=n;i++)
            M=max(M,f[i][0]+f[i][1]);
        printf("%d
",sum*2-M);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yanlifneg/p/6001671.html