总结:
1.这道题算是相对比较麻烦的一道题,开始题意没读懂,A graph which is connected and acyclic can be considered a tree.开始没明白他说的这个树是什么,被acyclic误导了,以为不能出现三角形这种循环的图,结果是大于2个最大连通子图都不是树
2.这道题的麻烦之处在于先要看该图是不是只有一个最大连通子图,如果是则要求最大深度的节点集合,不是输出。
我先采用dfs求最大连通图,再用了bfs求最大深度的集合,麻烦。
代码:
#include<iostream>
#include<queue>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int vi1[10000];
int maxarea = 0;
vector<vector<int> >pp;
map<int, vector<int> >sk;
void dfs(int index)
{
if (vi1[index] == 1)return;
else {
vi1[index] = 1;
for (int i = 0; i < pp[index].size(); i++)
dfs(pp[index][i]);
}
}
int main()
{
int n;
cin >> n; pp.resize(n+1);
for (int i = 1; i <= n - 1; i++)
{
int a, b;
scanf("%d%d",&a,&b);
pp[a].push_back(b); pp[b].push_back(a);
}
for (int i = 1; i <= n; i++)
{
if (!vi1[i])
{
dfs(i);
maxarea++;
}
}
if (maxarea > 1){
cout <<"Error: "<<maxarea<<" components"; return 0;
}
int deep = 0;
struct node{
int x;
int deep;
};
for (int i = 1; i <= n; i++)
{
queue<node> s; int vi[10000];
fill(vi, vi + 10000, 0); node ps; ps.deep = 1; ps.x = i;
s.push(ps); vi[i] = 1; int maxdeep = 0;
while (!s.empty())
{
node k = s.front(); s.pop();
for (int j = 0; j < pp[k.x].size(); j++)
{
if (!vi[pp[k.x][j]])
{
node p;
vi[pp[k.x][j]] = 1;
p.x = pp[k.x][j]; p.deep=k.deep+1;
if (p.deep>maxdeep)maxdeep = p.deep;
s.push(p);
}
}
}
sk[maxdeep].push_back(i);
}
auto it = sk.end(); it--; sort(it->second.begin(),it->second.end());
for (int i = 0; i<it->second.size(); i++)
{
printf("%d",it->second[i]);
if (i != it->second.size() - 1)printf("\n");
}
return 0;
}