码迷,mamicode.com
首页 > 其他好文 > 详细

树的直径模板

时间:2016-08-02 18:59:15      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

 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到树上其他节点的最大距离就是树的直径(树上两点间的最大距离) 

例题链接

树的直径模板

标签:

原文地址:http://www.cnblogs.com/yexiaozi/p/5730232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!