您的位置:首页 > 其它

1021. Deepest Root (25)

2018-03-03 13:03 281 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pat甲级 1021