• 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;
    }
  • 相关阅读:
    Linux 显示当前时间
    Jenkins 更改工作目录;
    Jenkins 编译 .net 项目
    Jenkins 通过 maven 构建编译 JAVA 项目环境
    Jenkins
    Zatree
    Zabbix 邮件报警示例
    Zabbix 短信报警示例
    Linux 检测出口IP地址
    数据结构与算法面试题80道(4)
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/6001671.html
Copyright © 2020-2023  润新知