[PAT] A1021 Deepest Root

tech2022-09-06  140

【题目大意】

给出n个结点和n-1条边,问它们能否形成一棵n个结点的树,如果能,从中选出结点作为树根,使整棵树的高度最大。输出所有满足要求的可以作为树根的结点。

【思路】

方法一:模拟。

1 连通、边数为n-1的图一定是一棵树。因此先判断连通图个数(用DFS遍历图,从而计算连通图个数),等于1则能形成一棵树。

2 遍历每一个节点,假设它为根节点构造一棵树。

方法二: 

1 由于连通、边数为n-1的图一定是一棵树,因此需要判断给定数据是否能使图连通。2 确定图连通后,则确定了树,选择合适根结点使树高最大的做法为:先任意选择一个结点,从该节点开始遍历整棵树,获取能达到的最深的结点,记为集合A;然后从集合A中任意一个结点出发遍历整棵树,获取能达到的最深顶点,记为结点集合B。集合A与B的并集就是所求结果。

https://blog.csdn.net/hy971216/article/details/82252707

https://blog.csdn.net/qq_38677814/article/details/80859998

https://blog.csdn.net/sinat_29278271/article/details/47934611

 【tips】

1 非二叉树其实可以想象成一个特殊的图来解决。像这一题,用的其实全都是图的知识来解决,因为其考点不在父子关系上。

2 也可以使用并查集判断连通图个数(未实践过):每读入一条边的两个端点,判断这两个端点是否属于相同的集合,如果不同,则将它们合并到一个集合中,当处理完所有边后根据最终产生的集合个数是否为1来判断给定的图是否连通。

【AC代码】

方法一:

1 #include<iostream> 2 #include<queue> 3 #include<vector> 4 using namespace std; 5 #define N 10002 6 vector<int>G[N]; 7 int n; 8 int vis[N] = { false }; 9 int level[N] = { 0 }; 10 void DFS(int u) 11 { 12 for (int i = 0; i < G[u].size(); i++) 13 { 14 int v = G[u][i]; 15 if (vis[v] == false) 16 { 17 vis[v] = true; 18 DFS(v); 19 } 20 } 21 } 22 int BFS(int root) 23 { 24 int mlevel = 0; 25 queue<int>q; 26 q.push(root); 27 vis[root] = true; 28 while (!q.empty()) 29 { 30 int u = q.front(); 31 q.pop(); 32 for (int i = 0; i < G[u].size(); i++) 33 { 34 int v = G[u][i]; 35 if (vis[v] == false) 36 { 37 q.push(v); 38 vis[v] = true; 39 level[v] = level[u] + 1; 40 if (level[v] > mlevel) 41 mlevel = level[v]; 42 } 43 } 44 } 45 return mlevel; 46 } 47 int main() 48 { 49 cin >> n; 50 int i; 51 for (i = 0; i < n - 1; i++) 52 { 53 int t1, t2; 54 cin >> t1 >> t2; 55 G[t1].push_back(t2); 56 G[t2].push_back(t1); 57 } 58 int tu = 0; 59 for (i = 1; i <= n; i++) 60 { 61 if (vis[i] == false) 62 { 63 tu++; 64 vis[i] == true; 65 DFS(i); 66 } 67 } 68 if (tu > 1) 69 { 70 cout << "Error: " << tu << " components"; 71 return 0; 72 } 73 int maxLevel = 0; 74 vector<int>ans; 75 for (i = 1; i <= n; i++) 76 { 77 fill(vis, vis + N, false); 78 fill(level, level + N, false); 79 int ceng = BFS(i); 80 if (ceng == maxLevel) 81 { 82 ans.push_back(i); 83 } 84 if (ceng > maxLevel) 85 { 86 ans.clear(); 87 ans.push_back(i); 88 maxLevel = ceng; 89 } 90 } 91 for (i = 0; i < ans.size(); i++) 92 cout << ans[i] << endl; 93 94 return 0; 95 }

 

方法二:

1 #include<iostream> 2 #include<queue> 3 #include<vector> 4 #include<set> 5 using namespace std; 6 #define N 10002 7 vector<int>G[N]; 8 int n; 9 bool vis[N] = { false }; 10 int level[N] = { 0 }; 11 void DFS(int u) 12 { 13 for (int i = 0; i < G[u].size(); i++) 14 { 15 int v = G[u][i]; 16 if (vis[v] == false) 17 { 18 vis[v] = true; 19 DFS(v); 20 } 21 } 22 } 23 int BFS(int root) 24 { 25 int mlevel = 0; 26 queue<int>q; 27 q.push(root); 28 vis[root] = true; 29 while (!q.empty()) 30 { 31 int u = q.front(); 32 q.pop(); 33 for (int i = 0; i < G[u].size(); i++) 34 { 35 int v = G[u][i]; 36 if (vis[v] == false) 37 { 38 q.push(v); 39 vis[v] = true; 40 level[v] = level[u] + 1; 41 if (level[v] > mlevel) 42 mlevel = level[v]; 43 } 44 } 45 } 46 return mlevel; 47 } 48 int main() 49 { 50 cin >> n; 51 int i; 52 for (i = 0; i < n - 1; i++) 53 { 54 int t1, t2; 55 cin >> t1 >> t2; 56 G[t1].push_back(t2); 57 G[t2].push_back(t1); 58 } 59 int tu = 0; 60 for (i = 1; i <= n; i++) 61 { 62 if (vis[i] == false) 63 { 64 tu++; 65 vis[i] = true; 66 DFS(i); 67 } 68 } 69 if (tu > 1) 70 { 71 cout << "Error: " << tu << " components"; 72 return 0; 73 } 74 75 fill(vis, vis + N, false); 76 fill(level, level + N, 0); 77 int maxlevel = BFS(1); 78 set<int>ans; 79 for (i = 1; i <= n; i++) 80 if (level[i] == maxlevel) 81 ans.insert(i); 82 set<int>::iterator it = ans.begin(); 83 int v = *it; 84 fill(vis, vis + N, false); 85 fill(level, level + N, 0); 86 maxlevel = BFS(v); 87 for (i = 1; i <= n; i++) 88 if (level[i] == maxlevel) 89 ans.insert(i); 90 for (it = ans.begin(); it != ans.end(); it++) 91 cout << *it << endl; 92 93 return 0; 94 }

 

1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<set> 4 #include<vector> 5 using namespace std; 6 #define MAX 10002 7 #define INF 10000000 8 vector<int>Adj[MAX]; 9 set<int>root, root1; 10 bool vis[MAX] = { false }; 11 int n, maxlevel = 0; 12 void DFS(int x, int level) { 13 vis[x] = true; 14 if (level > maxlevel) { 15 root.clear(); 16 root.insert(x); 17 maxlevel = level; 18 } 19 else if (level == maxlevel) 20 root.insert(x); 21 for (int i = 0; i < Adj[x].size(); i++) 22 if (vis[Adj[x][i]] == false) 23 DFS(Adj[x][i], level + 1); 24 } 25 int Trave() { 26 int i, times = 0; 27 fill(vis, vis + n + 1, false); 28 for (i = 1; i <= n; i++) { 29 if (vis[i] == false) { 30 maxlevel = 0; 31 DFS(i, 0); 32 times++; 33 } 34 } 35 return times; 36 } 37 int main() { 38 int i, a, b; 39 scanf("%d", &n); 40 for (i = 0; i < n - 1; i++) { 41 scanf("%d%d", &a, &b); 42 Adj[a].push_back(b); 43 Adj[b].push_back(a); 44 } 45 int ans = Trave(); 46 if (ans == 1) { 47 root1 = root; 48 auto it = root.begin(); 49 fill(vis, vis + n + 1, false); 50 DFS(*it, 0); 51 for (it = root1.begin(); it != root1.end(); it++) 52 root.insert(*it); 53 for (it = root.begin(); it != root.end(); it++) 54 printf("%d\n", *it); 55 } 56 else { 57 printf("Error: %d components", ans); 58 } 59 return 0; 60 }

 

最新回复(0)