考察连通分量个数,用搜索或并查集,并查集效率较高;
求最深的树根节点,用dfs
// 1021. Deepest Root.cpp: 主项目文件。
#include "stdafx.h"
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=10003;
bool used[N];
vector<int> edge[N];
vector<int> needRoot;
int maxLevel,tLevel,n;
void dfs(int cur,int level){
used[cur]=true;
if(level>=tLevel)
tLevel=level;
for(vector<int>::iterator ite=edge[cur].begin();ite!=edge[cur].end();ite++){
if(!used[*ite]){
dfs(*ite,level+1);
}
}
}
int countTrees(){
int cnt=0;
tLevel=-1;
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++){
if(!used[i]){
dfs(i,1);
++cnt;
}
}
return cnt;
}
void computeDeepestRoot(){
maxLevel=-1;
for(int i=1;i<=n;i++){
memset(used,0,sizeof(used));
tLevel=-1;
dfs(i,1);
if(tLevel>maxLevel){
maxLevel=tLevel;
needRoot.clear();
needRoot.push_back(i);
}
else if(tLevel==maxLevel)
needRoot.push_back(i);
}
for(vector<int>::iterator ite=needRoot.begin();ite!=needRoot.end();++ite)
printf("%d\n",*ite);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
int connectedCnt=countTrees();
if(connectedCnt>1)
printf("Error: %d components\n",connectedCnt);
else
computeDeepestRoot();
return 0;
}