资讯详情

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.

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 componentswhereKis 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; }

总结

  1. 一开始用邻接矩阵存储图纸,但总有一个测试用例超时,用邻接表妹代替ok了。
  2. 下次报告不理解错误时,记得逐一检查变量,是否写错变量名,如是否使用整数变量作为指针。
  3. 注意下标数组map使用时间,使用哪一段元素。
    fill(x, x   n   1, 0); fill(x   1, x   n   1, 0); fill(x   1, x   n, 0);

标签: eaco电容900v600uf

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台