1021. Deepest Root (25)
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 5Sample Output 1:
3 4 5Sample Input 2:
5 1 3 1 4 2 5 3 4Sample Output 2:
Error: 2 components
用了个很土的办法啊,最后一个测试案例内存超限了。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int map[10001][10001], n; int deep[10010], vis[10010], maxx; void dfs(int t, int ll) { int i; vis[t] = 1; if(ll > maxx) maxx = ll; for(i = 1; i <= n; i++) { if(vis[i] == 0 && map[t][i] == 1) dfs(i, ll+1); } } int main() { int i, j, a, b; while(scanf("%d", &n) != EOF) { for(i = 1; i < n; i++) { scanf("%d %d", &a, &b); map[a][b] = 1; map[b][a] = 1; } memset(deep, 0, sizeof(deep)); int tmp = 0; for(i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); maxx = -1; dfs(i, 1); deep[i] = maxx; for(j = 1; j <= n; j++) if(vis[j] == 0) tmp++; } if(tmp != 0) { int count = 1; for(i = 1; i <= n; i++) { if(vis[i] == 0) { dfs(i, 0); count++; } } printf("Error: %d components\n", count); continue; } for(i = 1; i <= n; i++) if(deep[i] > tmp) tmp = deep[i]; for(i = 1; i <= n; i++) { if(deep[i] == tmp) printf("%d\n", i); } } return 0; }