tjut 3534

来源:互联网 发布:网络克隆系统教程 编辑:程序博客网 时间:2024/04/29 15:52
#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;  }

0 0
原创粉丝点击