如果这道题得到了20分,有可能是因为在第一dfs时有多个最深路径,但我们只取了第一个,那么最终结果就会少掉我们漏掉的那些。
本想用sort来排序,但感觉还是set好实现一些
#include <stdio.h>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
const int maxv=10010;
int n,block=0;
bool vis[maxv]={false};
vector<int> graph[maxv];
vector<int> maxpoint;
int maxdepth=0;
set<int> outcome;
void dfs(int s,int depth){
vis[s]=true;
if(depth>maxdepth){
maxdepth=depth;
maxpoint.clear();
maxpoint.push_back(s);
}else if(depth==maxdepth){
maxpoint.push_back(s);
}
for(int i=0;i<graph[s].size();i++){
if(vis[graph[s][i]]==false){
dfs(graph[s][i],depth+1);
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int k,l;
scanf("%d %d",&k,&l);
graph[k].push_back(l);
graph[l].push_back(k);
}
int block=0;
int big;
for(int i=1;i<=n;i++){
if(vis[i]==false){
dfs(i,1);
block++;
}
if(i==1){
memset(vis,false,sizeof(vis));
for(int j=0;j<maxpoint.size();j++){
outcome.insert(maxpoint[j]);
}
dfs(maxpoint[0],1);
}
}
if(block!=1){
printf("Error: %d components",block);
}else{
for(int i=0;i<maxpoint.size();i++){
outcome.insert(maxpoint[i]);
}
for(set<int>::iterator it=outcome.begin();it!=outcome.end();it++){
printf("%d\n",*it);
}
}
return 0;
}