首页 > 其他 > 详细

1021 Deepest Root (25分)

时间:2020-03-21 04:17:08      阅读:49      评论:0      收藏:0      [点我收藏+]

 

技术分享图片

 

 

暴力搜索...用dfs判断连通分量个数。如果不是1,连通分量个数,如果是1,输出根节点序号(使得树高最大的根节点)。

有人用两次dfs,说什么这两次搜索的末端节点的并集就是答案,这背后是不是有什么数学原理?不太理解。我直接暴力搜索了,逐个节点进行dfs,过程中记录节点高度。好在没有超时。这道题给了2000ms的时间,一般的题都是400ms,出题者这不就是默认了暴力搜索也是正解吗...

ps:我大概能懂那个思路了,无论从哪个节点开始dfs,高度最高的节点一定是红色节点,可能是左边可能是右边。从这一次dfs搜索出来的高度最高的任一节点再次进行dfs,可以得到另一边的红色节点,这些红色节点的并集,就是题目要求的根节点。

技术分享图片

 1 #include <iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 vector<int> V(10010);
 6 vector<vector<int> > E(10010);
 7 vector<int> visited(10010,0);
 8 int Max=0; 
 9 void dfs(int v,int height){
10     visited[v]=1;
11     if(height>V[v])//每个节点存的是它的最大高度 
12       V[v]=height;
13     if(height>Max)//Max存的是最大高度 
14        Max=height;
15     for(int i=0;i<E[v].size();i++){
16         if(visited[E[v][i]]==0)
17           dfs(E[v][i],height+1);
18     }    
19 }
20 int main()
21 {    
22   int N;
23   scanf("%d",&N);
24   int c1,c2;
25   for(int i=1;i<N;i++){
26       scanf("%d%d",&c1,&c2);
27       E[c1].push_back(c2);
28       E[c2].push_back(c1);
29   }
30   int cnt=0;
31   for(int i=1;i<=N;i++){
32       if(visited[i]==0)
33          {dfs(i,1);
34              cnt++;
35          }
36   }
37   if(cnt!=1)
38     printf("Error: %d components",cnt);
39   else
40     { for(int i=1;i<=N;i++)
41     {  fill(visited.begin(),visited.begin()+N+1,0);
42          dfs(i,1);    
43     }
44       for(int i=1;i<=N;i++)    {
45           if(V[i]==Max)
46           printf("%d\n",i);
47       }
48     }
49   return 0;
50 }

 

1021 Deepest Root (25分)

原文:https://www.cnblogs.com/wsshub/p/12535474.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!