zoukankan      html  css  js  c++  java
  • hdu 3721 树的直径

    思路:枚举+树的直径

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #define clr(x,y) memset(x,y,sizeof(x))
    #define Maxn 3000
    #define inf 100000000
    using namespace std;
    int head[Maxn],Max[Maxn],lMax[Maxn],id[Maxn],road[Maxn],e,n,ans,te;
    bool vi[Maxn];
    struct Edge{
        int u,v,next,val;
    }edge[Maxn*2];
    void init()
    {
        clr(head,-1);
        clr(vi,0);
        clr(Max,0);
        clr(lMax,0);
        clr(road,0);
        clr(id,0);
        e=0;
    }
    void add(int u,int v,int val)
    {
        edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].next=head[u],head[u]=e++;
        edge[e].u=v,edge[e].v=u,edge[e].val=val,edge[e].next=head[v],head[v]=e++;
    }
    void dfs(int u,int col,int fa)
    {
        int v,i;
        id[u]=col;
        for(i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            if(v==fa) continue;
            dfs(v,col,u);
            if(Max[v]+edge[i].val>Max[u]){
                lMax[u]=Max[u];
                Max[u]=Max[v]+edge[i].val;
                road[u]=v;
            } else if(Max[v]+edge[i].val>lMax[u])
                lMax[u]=Max[v]+edge[i].val;
        }
        te=max(te,lMax[u]+Max[u]);
    }
    void predfs(int u,int d,int fa)
    {
        int v,i;
        Max[u]=max(Max[u],d);
        for(i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            if(v==fa) continue;
            if(road[u]==v) predfs(v,max(lMax[u],d)+edge[i].val,u);
            else predfs(v,max(Max[u],d)+edge[i].val,u);
        }
    }
    void solve()
    {
        int i,j,u,v,val,a,b;
        ans=inf;
        for(i=0;i<e-1;i+=2){
            u=edge[i].u,v=edge[i].v,val=edge[i].val;
            clr(Max,0);
            clr(lMax,0);
            a=b=inf;
            te=0;
            dfs(u,0,v);
            predfs(u,0,v);
            dfs(v,1,u);
            predfs(v,0,u);
            for(j=1;j<=n;j++){
                //cout<<j<<" "<<id[j]<<" "<<Max[j]<<endl;
                if(id[j]) a=min(a,Max[j]);
                else b=min(b,Max[j]);
            }
            ans=min(ans,max(a+b+val,te));
            //cout<<a<<" "<<b<<" "<<val<<endl;
           // cout<<"******************"<<endl;
        }
        return ;
    }
    int main()
    {
        int i,j,u,v,val,t,Ca=0;
        scanf("%d",&t);
        while(t--){
            init();
            scanf("%d",&n);
            for(i=1;i<n;i++){
                scanf("%d%d%d",&u,&v,&val);
                u++,v++;
                add(u,v,val);
            }
            solve();
            printf("Case %d: %d
    ",++Ca,ans);
        }
        return 0;
    }
  • 相关阅读:
    UIView添加手势
    UIView常见属性设置汇总
    关于页面传值
    有关segue的简介
    alloc
    如何定义静态方法
    一座小城
    清明
    开通博客
    iOS学习之界面间传值
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3359290.html
Copyright © 2011-2022 走看看