tjut 3534

#include<stdio.h>  
#include<string.h>  
const int N=500000;  
const int inf=0x3fffffff;  
int head[N],num,Len[N],ans,node[N],k;  
struct edge  
{  
    int ed,w,next;  
}e[N*2];  
void addedge(int x,int y,int w)  
{  
    e[num].ed=y;e[num].w=w;e[num].next=head[x];head[x]=num++;  
    e[num].ed=x;e[num].w=w;e[num].next=head[y];head[y]=num++;  
}  
void dfs(int u,int fa)  
{  
    int i,v,temp;  
    Len[u]=0;//最长边  
    node[u]=1;//最长边的个数  
    for(i=head[u];i!=-1;i=e[i].next)  
    {  
        v=e[i].ed;  
        if(v==fa)continue;  
        dfs(v,u);  
        temp=Len[v]+e[i].w;  
        if(temp+Len[u]>ans)//最长边经过v  
        {  
            k=node[v]*node[u];  
            ans=temp+Len[u];  
        }  
        else if(temp+Len[u]==ans)  
            k+=node[v]*node[u];  
        if(Len[u]<temp)//更新最长边  
        {  
            Len[u]=temp;  
            node[u]=node[v];  
        }  
        else if(Len[u]==temp)//更新最长边的个数  
            node[u]+=node[v];  
    }  
}  
int main()  
{  
    int n,i,x,y,w;  
    while(scanf("%d",&n)!=-1)  
    {  
        memset(head,-1,sizeof(head));  
        num=0;  
        for(i=1;i<n;i++)  
        {  
            scanf("%d%d%d",&x,&y,&w);  
            addedge(x,y,w);  
        }  
        ans=-inf;k=0;  
        dfs(1,0);  
        printf("%d %d\n",ans,k);  
    }  
    return 0;  
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luozhong11/article/details/52385927
个人分类: 树形dp
上一篇tjut 3525
下一篇tjut 3529
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭