//1021. Deepest Root (25)
//第二个case是测试N =0 的情况
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
vector<int> Road[10005];
int VisitedNum = 0;
bool visit[10005] = {false};
int N;
queue<int> q;
int currlen = 0;
int maxlen = 0;
vector<int> result;
void dfs(int curr)
{
int i;
if (currlen >= maxlen)
{
if (currlen == maxlen)
{
if (find(result.begin(), result.end(), curr)==result.end())
{
result.push_back(curr);
}
}
else
{
maxlen = currlen;
result.pop_back();
if (find(result.begin(), result.end(), curr)==result.end())
{
result.push_back(curr);
}
}
}
for (i = 1;i<=N;i++)
{
if (i!=curr && /*Road[i][curr] == true*/ find(Road[curr].begin(), Road[curr].end(), i)!=Road[curr].end() && visit[i] == false)
{
visit[curr] = true;
VisitedNum++;
currlen++;
dfs(i);
visit[curr] = false;
VisitedNum--;
currlen--;
}
}
}
int main()
{
scanf("%d", &N);
int i;
int n1, n2;
for (i = 1;i<N;i++)
{
scanf("%d %d", &n1, &n2);
Road[n1].push_back(n2);
Road[n2].push_back(n1);
}
if (N == 1)
{
printf("1\n");
return 0;
}
//BFS
int componentsnum = 0;
int j;
for ( j = 1;j<=N;j++)
{
if (visit[j] == true)
{
continue;
}
q.push(j);
while(!q.empty())
{
int topnum = q.front();
q.pop();
for( i = 0 ;i<Road[topnum].size();i++)
{
if (visit[Road[topnum][i]] == false)
{
q.push(Road[topnum][i]);
visit[Road[topnum][i]] = true;
}
}
}
if (q.empty())
{
componentsnum++;
}
}
if (componentsnum != 1)
{
printf("Error: %d components", componentsnum);
return 0;
}
fill(visit, visit+N+1, false);
VisitedNum = 1;
visit[1]=true;
dfs(1);
if (result.size()> 1)
{
sort(result.begin(), result.end());
for (i = 0;i<result.size();i++)
{
printf("%d\n", result[i]);
}
return 0;
}
fill(visit, visit+N+1, false);
VisitedNum = 1;
visit[result[0]] = true;
currlen = 0;
//maxlen = 0;
dfs(result[0]);
sort(result.begin(), result.end());
for (i = 0;i<result.size();i++)
{
printf("%d\n", result[i]);
}
return 0;
}
PAT 1021. Deepest Root (25)
最新推荐文章于 2022-03-06 17:13:01 发布