PAT (Advanced Level) Practice 1021 Deepest Root (25 分)

#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <queue>
using namespace std;

const int maxn=10010;
vector<int> Adj[maxn];
int N;
set<int> droot;
bool vis[maxn];
bool inq[maxn];
int edge;

void BFS(int u){
	queue<int> q;
	q.push(u);
	inq[u]=true;
	while(!q.empty()){
		int v=q.front();
		q.pop();
		for(int i=0;i<Adj[v].size();i++){
			int t=Adj[v][i];
			if(!inq[t]){
				inq[t]=true;
				edge++;
				q.push(t);
			}
		}
	}
}
 
int BFSTravel(){
	fill(inq,inq+maxn,false);
	int cnt=0;
	edge=0;
	for(int u=1;u<=N;u++){
		if(!inq[u]){
			BFS(u);
			cnt++;
		}
	}
	return cnt;
}

int isTree(){
	int cnt=BFSTravel();
	if(cnt==1 && edge==N-1) return -1;
	return cnt;
} 

int findR(int r){
	int h=0;
	vis[r]=true;
	for(int i=0;i<Adj[r].size();i++){
		int v=Adj[r][i];
		if(!vis[v]){
			int th=findR(v);
			if(th>h) h=th;
		}
	}
	return h+1;
}

int main(void){
	scanf("%d",&N);
	int v1,v2;
	for(int i=0;i<N-1;i++){
		scanf("%d%d",&v1,&v2);
		Adj[v1].push_back(v2);
		Adj[v2].push_back(v1);
	}
	int judge=isTree();
	if(judge!=-1){
		printf("Error: %d components",judge);
		return 0;
	} 
	int h=-1,th;
	for(int i=1;i<=N;i++){
		fill(vis,vis+maxn,false);
		th=findR(i);
		if(th>h){
			droot.clear();
			droot.insert(i);
			h=th;
		}else if(th==h){
			droot.insert(i);
		}
	}
	
	set<int>::iterator it;
	for(it=droot.begin();it!=droot.end();it++){
		printf("%d\n",*it);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值