PAT1021

1021 Deepest Root (25 分)

这一题有两个关键点,一点一点对比AC代码才弄懂的:
(1)存在孤立点,故38行不能只对n-1个顶点搜
(2)求并集要剔除重复的

#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> g;
vector<int> visit;
vector<int> v,b;
int Max;
void dfs(int s,int dp) {
	int flag=0;
	visit[s] = 1;
    for (int i = 0; i<g[s].size(); ++i) {
		if(visit[g[s][i]]==0) {
			dfs(g[s][i],dp+1);
			flag=1;
		}
	}
	if(flag==0) {
		if(dp>Max) {
			Max = dp;
			v.clear();
			v.push_back(s);
		} else if(dp==Max)
			v.push_back(s);
	}
}
int main() {
	int n;
	int k;
	int i,j,a,b;
	int sum = -1;
	cin >> n;
	g.resize(n + 1);
	visit.resize(n + 1);
	for (i = 1; i<n; ++i) {
		scanf("%d%d", &a, &b);
		g[a].push_back(b);
		g[b].push_back(a);
	}
    for (i = 1; i <= n; ++i)
        if (visit[i] == 0) 
        {
            sum++;
            Max = 0;
            dfs(i, 0);
        }
	if(sum>0)
		printf("Error: %d components",sum+1);
	else {
		fill(visit.begin(), visit.end(), 0);
		k = v[0];
		Max = 0;
		b = v;
        v.clear();
        dfs(k, 0);
		v.insert(v.end(), b.begin(), b.end());
		sort(v.begin(), v.end());
		for (i = 0; i<v.size(); ++i){
            printf("%d\n", v[i]);
            while (i+1 < v.size()&&v[i]==v[i+1])
                    ++i;
        }
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值