题目是要判断图是否都连接构成树,求使树高最大的所有的根,实际上求图上两点间最大距离。我的思路是依次取各点进行DFS,记下各点可达的最大深度,再在其中取最大值,若各点的最大深度等于该值,该点为所求。若最大深度不等于n-1,则不是一棵树,再用并查集判断有几部分。可能思路有问题,WA了N久。参考网上程序,发现树的最长路径其实有个很方便的求法。任取一个点x,求出距离x最远的一个点y,然后求出距离y最远的一个点z。y到z就是一条最长路径。他是先用并查集判断共有几个部分,再bfs求距离,先任取一点开始bfs,得到最远的叶节点,以此叶节点再bfs可得。
AC代码:(用邻接表,可以看下)
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<memory.h>
using namespace std;
const int NUM=10005;
int isVisit[NUM];
int flag,n;
int step=1;
int parent[NUM];
// void dfs(int src,int cId)
// {
// int i;
// isVisit[cId]=1;
// if(step>deep[src])
// deep[src]=step;
// for(i=1;i<=n;i++){
// if(isVisit[i]==0&&map[cId][i]==1){
// step+=1;
// dfs(src,i);
// isVisit[i]=0;
// step-=1;
//
// }
//
// }
// }
vector<int> map[NUM];//邻接表
vector<int> ans;
int dis[NUM];
int bfs(int x)//广搜,相当于获得以1为根的树的最大深度
{
queue<int> q;
memset(isVisit,0,sizeof(isVisit));
isVisit[x]=1;
int maxv=0;
q.push(x);
while(!q.empty()){
int v=q.front();
q.pop();
int i;
if(dis[v]>maxv)
maxv=dis[v];
for(i=0;i<map[v].size();++i)
if(!isVisit[map[v][i]]){
isVisit[map[v][i]]=1;
dis[map[v][i]]=dis[v]+1;//深度+1
q.push(map[v][i]);
}
}
return maxv;
}
int find(int x)
{
int r=x;
while(parent[r]!=r){
r=parent[r];
}
return r;
}
void merge(int a, int b)
{
int x=find(a);
int y=find(b);
if(x!=y)
parent[y]=x;
}
int main()
{
int a,b,i,sum;
freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
cin>>n;
for(i=1;i<=n;i++)
parent[i]=i;
for(i=0;i<n-1;i++){
cin>>a>>b;
map[a].push_back(b);
map[b].push_back(a);
merge(a,b);
}
sum=0;
for(i=1;i<=n;i++){
if(parent[i]==i)
sum++;
}
if(sum>1){//有多个分支
cout<<"Error: "<<sum<<" components"<<endl;
} else {//若是树,则求图中两点的最大距离树的最长路径,任取一个点x,求出距离x最远的一个点y,然后求出距离y最远的一个点z。y到z就是一条最长路径。
int maxv=bfs(1);
for(i=1;i<=n;++i){//求出距离x最远的一个点y
if(dis[i]==maxv)
ans.push_back(i);
}
maxv=bfs(ans[0]);//求出距离y最远的一个点z
for(i=1;i<=n;++i){
if(dis[i]==maxv)
ans.push_back(i);
}
sort(ans.begin(),ans.end());
cout<<ans[0]<<endl;
for(i=1;i<ans.size();++i)
if(ans[i]!=ans[i-1])
cout<<ans[i]<<endl;
}
return 0;
}