原题
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.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integerN(≤104) which is the number of nodes, and hence the nodes are numbered from 1 toN. ThenN?1lines 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, printError: K components
whereK
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
结尾无空行
思路
使用深度优先算法算法,查看是否有超过一个联通重量。如果有直接返回,如果没有,则以每个节点为根节点遍历图,计算每遍历的最大深度。
通过代码
#include <bits/stdc .h> using namespace std; int visited[10001]; vector <vector<int> > g; int d[10001]; int n; void dfs(int x,int deep) { deep ; visited[x] = 1; //printf("处理%d:\n",x); for (int i = 0; i < g[x].size(); i ) { if (visited[g[x][i]] == 0 && g[x][i] > 0) { //printf(" 处理%d:\n",g[x][i]); dfs(g[x][i],deep); } } if (deep > d[x])d[x] = deep; //printf(" 处理%d时深度是%d\n",x,deep); deep--; } int main() { int node1, node2, k = 0, deepest = 0; scanf("%d", &n); g.resize(n 1); fill(visited, visited n 1, 0); fill(d, d n 1, 0); for (int i = 1; i <= n - 1; i ) { scanf("%d%d", &node1, &node2); g[node1].push_back(node2); g[node2].push_back(node1); } for (int i = 1; i <= n; i ) { if (visited[i] == 0) { dfs(i,0); k ; } } if (k > 1) { printf("Error: %d components", k); return 0; } for (int i = 1; i <= n; i ) { fill(visited 1, visited n 1, 0); dfs(i,0); } for (int i = 1; i <= n; i ) { if (d[i] > deepest) { deepest = d[i]; } } for (int i = 1; i <= n; i ) { if (d[i] == deepest) { printf("%d\n", i); } } return 0; }
总结
- 一开始用邻接矩阵存储图纸,但总有一个测试用例超时,用邻接表妹代替ok了。
- 下次报告不理解错误时,记得逐一检查变量,是否写错变量名,如是否使用整数变量作为指针。
- 注意下标数组map使用时间,使用哪一段元素。
fill(x, x n 1, 0); fill(x 1, x n 1, 0); fill(x 1, x n, 0);