hdu2196 树的直径 + bfs

时间:2023-03-09 02:02:12
hdu2196 树的直径 + bfs
 //Accepted    740 KB    15 ms
 //树的直径
 //距离一个顶点最远的点一定是树的直径的一个端点
 #include <cstdio>
 #include <cstring>
 #include <queue>
 #include <iostream>
 using namespace std;
 ;
 int dis[imax_n];
 int d1[imax_n];
 int d2[imax_n];
 int head[imax_n];
 *imax_n];
 int e;
 struct node
 {
     int u,v,c;
     node()
     {

     }
     node(int u,int v,int c)
     {
         this->u=u;
         this->v=v;
         this->c=c;
     }
 }p[*imax_n];
 int n;
 void addEdge(int u,int v,int c)
 {
     p[e]=node(u,v,c);
     next[e]=head[u];
     head[u]=e++;
 }
 void init()
 {
     memset(head,-,sizeof(head));
     memset(next,-,sizeof(next));
     e=;
 }
 void read()
 {
     init();
     int x,y;
     ;i<=n;i++)
     {
         scanf("%d%d",&x,&y);
         addEdge(i,x,y);
         addEdge(x,i,y);
     }
 }
 int max(int a,int b)
 {
     return a>b?a:b;
 }
 queue<int >q;
 bool vis[imax_n];
 int bfs(int s)
 {
     //printf("111111\n");
     memset(dis,,sizeof(dis));
     ;
     int temp_node;
     while (!q.empty()) q.pop();
     memset(vis,,])*(n+));
     q.push(s);
     vis[s]=;
     while (!q.empty())
     {
         int x=q.front();
         if (dis[x]>ans)
         {
             ans=dis[x];
             temp_node=x;
         }
         q.pop();
         ;i=next[i])
         {
             int y=p[i].v;
             if (!vis[y])
             {
                 vis[y]=;
                 q.push(y);
                 if (dis[x]+p[i].c>dis[y])
                 dis[y]=dis[x]+p[i].c;
             }
         }
     }
     return temp_node;
 }
 int main()
 {
     while (scanf("%d",&n)!=EOF)
     {
         read();
         );
         x=bfs(x);
         memcpy(d1,dis,sizeof(dis));
         bfs(x);
         memcpy(d2,dis,sizeof(dis));
         ;i<=n;i++)
         {
             printf("%d\n",max(d1[i],d2[i]));
         }
     }
     ;
 }