PAT1021. Deepest Root (25)

之前不知道怎么判断是不是树,参考了

http://blog.csdn.net/eli850934234/article/details/8926263

但是最后有一个测试点有超时,在bfs里我用了数组拷贝,所以简化成直接访问超时就没有了。

#include <iostream>  
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int bing[10005];
int n;
int bfs(int node); 
vector<int> nodeList[10005];
vector<int> maxDis;
int vis[10005];
int unionFind(int a){
	if(bing[a]==0) return a;
	else return unionFind(bing[a]);
}
void unionUnion(int a,int b){
	int ia=unionFind(a);
	int ib=unionFind(b);
	if(ia!=ib) bing[ia]=ib;
}
int bfs(int node){
	memset(vis,0,sizeof(vis));
	queue<int> q;
	q.push(node);
	int co=1;
	int co2=0;
	int depth=0;
	while(!q.empty()){	
		int fro=q.front();
		vis[fro]=1;
		q.pop();
		for(int k=0;k<nodeList[fro].size();k++){
			if(vis[nodeList[fro][k]]==0){
				q.push(nodeList[fro][k]);
				co2++;
			} 
		}
		co--;
		if(co==0) {
			co=co2;
			co2=0;
			depth++;
		}
	}
	return depth;
}

int main(){
	cin>>n;
	int i,j;
	for(int m=0;m<n-1;m++){
		cin>>i>>j;
		unionUnion(i,j);
		nodeList[i].push_back(j);
		nodeList[j].push_back(i);
	}
	int count=0;
	for(int m=1;m<=n;m++){
		if(bing[m]==0) count++;
	}
	if(count!=1){
		printf("Error: %d components",count);
		return 0;
	}
	int max=0;
	for(int m=1;m<=n;m++){
		int dis=bfs(m);
		if(max<dis){
			maxDis.clear();
			max=dis;
			maxDis.push_back(m);
		}else if(max==dis){
			maxDis.push_back(m);
		}
	}
	for(int m=0;m<(maxDis.size());m++){
		cout<<maxDis[m]<<endl;
	}
	return 0;
}

 

posted @ 2016-03-27 15:47  Yellowman  阅读(191)  评论(0编辑  收藏  举报
TVRBMExqRXlPQzR5TXpjdU1UVTEK\n