PAT (Advanced) 1021. Deepest Root (25)
来源:互联网 发布:淘宝云客服登录网址 编辑:程序博客网 时间:2024/05/20 18:54
原题:1021. Deepest Root (25)
解题思路:
1.第一步采用广度优先遍历计算连通分量数目。
2.若连通分量只有一个,对所有的点进行广度优先搜索,每次返回对应的树的最大深度,最后把深度最大的树的根输出
注:题目数据较大,用邻接表存储图。
C++代码如下:
#include<cstdio>#include<vector>#include<queue>#include<algorithm>using namespace std;const int maxn = 10010;struct Node{ int depth; vector<int> next;} G[maxn];vector<int> ans; //结果int vis[maxn];//广度优先遍历int BFS(int index){ queue<int> Q; int level = 0; Q.push(index); G[index].depth = 1; //根的深度为1 vis[index] = 1; while(!Q.empty()) { int top = Q.front(); Q.pop(); level = max(level, G[top].depth); //刷新最大深度 for(int i = 0; i < G[top].next.size(); i++) { if(vis[G[top].next[i]] == 0) { vis[G[top].next[i]] = 1; G[G[top].next[i]].depth = G[top].depth + 1; //下一个点的深度等于当前深度加1 Q.push(G[top].next[i]); } } } return level;}int main(){ int n; while(scanf("%d", &n) != EOF) { for(int i = 0; i < n - 1; i++) { int a, b; scanf("%d%d", &a, &b); G[a].next.push_back(b); G[b].next.push_back(a); } int maxLevel = 0; int nowLevel; int cnt = 0; //先判断连通分量个数 fill(vis, vis + n + 1, 0); for(int i = 1; i <= n; i++) { if(vis[i] == 0) { nowLevel = BFS(i); cnt++; } } if(cnt > 1) //连通分量大于一个 { printf("Error: %d components\n", cnt); } else //否则 { //对每个点都计算一次生成树的深度 for(int i = 1; i <= n; i++) { fill(vis + 1, vis + n + 1, 0); nowLevel = BFS(i); if(nowLevel > maxLevel) { //当前的深度更大 //更新ans内的内容 maxLevel = nowLevel; ans.clear(); ans.push_back(i); } else if(nowLevel == maxLevel) //相等则加入 ans.push_back(i); } //由于是从小到大计算的,直接输出即可 for(int i = 0; i < ans.size(); i++) printf("%d\n", ans[i]); } } return 0;}
阅读全文
0 0
- 【PAT Advanced Level】1021. Deepest Root (25)
- 【PAT】【Advanced Level】1021. Deepest Root (25)
- PAT (Advanced) 1021. Deepest Root (25)
- 1021. Deepest Root (25) @ PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1021. Deepest Root (25)
- 浙大 PAT Advanced level 1021. Deepest Root (25)
- 1021. Deepest Root (25)-PAT
- PAT 1021. Deepest Root (25)
- PAT 1021. Deepest Root (25)
- PAT 1021. Deepest Root (25)
- PAT 1021. Deepest Root (25)
- PAT 1021. Deepest Root (25)
- 【PAT】1021. Deepest Root (25)
- pat 1021. Deepest Root (25)
- 【PAT】1021. Deepest Root (25)
- pat 1021. Deepest Root (25)
- PAT 1021. Deepest Root (25)
- PAT (Advanced Level) Practise 1021 Deepest Root (25)
- Lecture 2: Operators and operands; statements; branching, conditionals, and iteration
- C++中一些知识总结
- Redis 命令
- 个人居间行为或中介行为附和法律程序不?
- PE头结构学习-----PE头移位
- PAT (Advanced) 1021. Deepest Root (25)
- canopy 安装 包管理没有的模块
- 神奇的BFC
- 敏捷宣言遵循的原则
- 彻底弄懂HTTP缓存机制及原理
- 波特率与比特率的关系
- SpringMVC源码分析(二)从框架设计说起
- K-MEANS算法
- 如何使用Dockerfile构建Docker镜像