1021. Deepest Root (25)
时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B
判题程序 Standard 作者 CHEN, Yue
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
思路:针对每一个顶点u进行广度优先遍历即可
#define _CRT_SECURE_NO_WARNINGS
#include <algorithm>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <vector>
#include <string>
#include <cfloat>
#include <queue>
#include <map>
typedef struct lnode
{
int data;
int next;
lnode() { next = -1; }
}LNode;
using namespace std;
const int MaxN = 10010;
vector<int>G[MaxN];
vector<int> root;
bool isInq[MaxN];
int deep = 0;
void BFS(int st)
{
queue<int> que, backque; que.push(st); isInq[st] = true; int tdeep = 0;
while (que.size())
{
while (que.size())
{
int u = que.front(); que.pop();
for (int i = 0; i < G[u].size(); ++i)
{
int v = G[u][i];
if (!isInq[v])
{
backque.push(v);
isInq[v] = true;
}
}
}
++tdeep;
swap(que, backque);
}
if (tdeep > deep)
{
root.clear();
root.push_back(st);
deep = tdeep;
}
else if (tdeep == deep)
root.push_back(st);
}
int main()
{
#ifdef _DEBUG
freopen("data.txt", "r+", stdin);
#endif // _DEBUG
std::ios::sync_with_stdio(false);
int n;
cin >> n;
for (int i = 1; i < n; ++i)
{
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
BFS(1); bool connected = true; int com = 1;
for (int i = 2; i <= n; ++i)
{
if (!isInq[i])
{
connected = false;
++com;
BFS(i);
}
}
if (!connected)
{
cout << "Error: " << com << " components";
return 0;
}
for (int i = 2; i <= n; ++i)
{
memset(isInq, 0, sizeof(isInq));
BFS(i);
}
for (int i = 0; i < root.size(); ++i)
cout << root[i] << endl;
return 0;
}