PAT 甲级 1021. Deepest Root(dfs:无向图的最远路径、连通分量个数)
来源:互联网 发布:龙泉驾校网络预约系统 编辑:程序博客网 时间:2024/05/16 15:16
原题传送门
// 一次dfs可以得到从指定结点到它的最远结点的路径;可以用一个数组存储下这批最远结点// 任取上一批中的一结点开始,第二次dfs可以得到无向图的最远路径;用另一个数组存储下这批最远结点// 两个数组的并集就是deepest root#include <iostream>#include <vector>#include <set>using namespace std;int max_height = 0;vector<vector<int>> v; // = vector<int> v[100]bool visit[10010] = {false};set<int> s; // set和multiset会根据特定的排序准则自动将元素排序,set中元素不允许重复,multiset可以重复。因为是排序的,所以set中的元素不能被修改,只能删除后再添加。vector<int> temp; // 存储离根最远的结点,一个或多个void dfs(int node, int height) { if(height > max_height) { temp.clear(); temp.push_back(node); max_height = height; } else if(height == max_height) { temp.push_back(node); } visit[node] = true; for(int i = 0; i < v[node].size(); ++i) { if(visit[v[node][i]] == false) dfs(v[node][i], height+1); }}int main(int argc, const char * argv[]) { int n; cin >> n; v.resize(n+1); int a, b, cnt = 0; for(int i = 0; i <= n; ++i) { cin >> a >> b; v[a].push_back(b); v[b].push_back(a); } // 第一次深度优先搜索判断它有几个连通分量,并得到从根1开始的最远结点 int s1 = 0; // 任取temp[]中得一个结点 for(int i = 1; i <= n; ++i) { if(visit[i] == false) { dfs(i, 1); if(i == 1) { for(int j = 0; j < temp.size(); ++j) { s.insert(temp[j]); if(j == 0) s1 = temp[j]; } } cnt++; } } if(cnt >= 2) { // 如果有多个连通分量,那就输出Error: x components printf("Error: %d components", cnt); } else { // 如果只有一个连通分量,进行第二次dfs,以上次最远结点为根 temp.clear(); max_height = 0; fill(visit, visit+10010, false); dfs(s1, 1); for(int i = 0; i < temp.size(); ++i) s.insert(temp[i]); for(set<int>::iterator it = s.begin(); it != s.end(); it++) printf("%d\n", *it); } return 0;}
附原题
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root that results in a highest tree. Such a root is called the deepest root.
- Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=10000) which is the number of nodes, and hence the nodes are numbered from 1 to N. Then N-1 lines follow, each describes an edge by given the two adjacent nodes’ numbers.
- Output Specification:
For each test case, print each of the deepest roots in a line. If such a root is not unique, print them in increasing order of their numbers. In case that the given graph is not a tree, print “Error: K components” where K is the number of connected components in the graph.
- Sample Input 1:
5
1 2
1 3
1 4
2 5 - Sample Output 1:
3
4
5 - Sample Input 2:
5
1 3
1 4
2 5
3 4 - Sample Output 2:
Error: 2 components
- PAT 甲级 1021. Deepest Root(dfs:无向图的最远路径、连通分量个数)
- 1021. Deepest Root (25)-PAT甲级真题(图的遍历,dfs,连通分量的个数)
- pat甲级 1021. Deepest Root(bfs求连通分量)
- 1013. Battle Over Cities (25)-PAT甲级真题(图的遍历,统计强连通分量的个数,dfs)
- PAT甲级真题1013. Battle Over Cities (25)(图的遍历,统计强连通分量的个数,dfs)
- [PAT-甲级]1021.Deepest Root
- 无向图dfs求连通分量
- 关于求无向图的连通分量的个数
- SDUT 1488 数据结构实验:连通分量个数(无向图的连通)
- 改造DFS算法计算无向图的连通分量(java算法)
- [PAT甲级]1013. Battle Over Cities (25)(图的遍历,统计强连通分量个数)
- 【PAT甲级】1021. Deepest Root (25)
- PAT甲级练习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】 Deepest Root (DFS)
- CSS深入理解vertical-align和line-height基友关系的复杂现象
- C++ 两个类头文件互相引用
- POJ 2085 Inversion 笔记
- bzoj1441: Min
- 移动端轮播滑动
- PAT 甲级 1021. Deepest Root(dfs:无向图的最远路径、连通分量个数)
- 监听Apk卸载、改变、及安装
- centos下nginx反向代理
- zeromq源码学习——ypipe
- Java内部类
- Linux日常——信号(2)之阻塞信号
- 链表的创建
- Android listview item删除动画和item排序动画
- 为什么方法中的内部类只能访问final修饰的局部变量