树的直径模板

 1 struct stu
 2 {
 3     int from,to,val,next;
 4 }st[M];                        //定义结构体储存节点和节点间的距离以及下一个节点的位置 
 5 
 6 
 7 void init()
 8 {
 9     num=0;
10     memset(head,-1,sizeof(head));
11 }                            //初始化函数 
12 
13 
14 void add_edge(int u,int v,int w)
15 {
16     st[num].from=u;                //储存节点u 
17     st[num].to=v;                //储存节点v 
18     st[num].val=w;                //储存节点u与v的距离 
19     st[num].next=head[u];        //储存下一个与节点u相连的节点的位置 
20     head[u]=num++;                //储存u节点的位置 
21 }                            
22 
23 
24 void bfs(int fir)                //搜索函数 
25 {    
26     ans=0;
27     int u;
28     memset(sum,0,sizeof(sum));    //以该节点结尾的最长路 
29     memset(flag,0,sizeof(flag));//标记被访问的节点 
30     queue<int>que;
31     que.push(fir);
32     flag[fir]=1;
33     while(!que.empty())
34     {
35     
36         u=que.front();
37         que.pop();
38         for(i = head[u] ; i != -1 ; i=st[i].next)
39         {
40             if(!flag[st[i].to] && sum[st[i].to] < sum[u]+st[i].val)
41             {
42                 sum[st[i].to]=sum[u]+st[i].val;
43                 if(ans < sum[st[i].to])
44                 {
45                     ans=sum[st[i].to];                //记录最大距离 
46                     node=st[i].to;                    //记录端点 
47                 }
48                 flag[st[i].to]=1;
49                 que.push(st[i].to);
50             }
51         }
52     }
53 }
54 
55 假设从节点1开始,找到节点u使得1到u的距离最大,那么节点u到树上其他节点的最大距离就是树的直径(树上两点间的最大距离) 

例题链接

——将来的你会感谢现在努力的自己。
原文地址:https://www.cnblogs.com/yexiaozi/p/5730232.html