1021 Deepest Root (25分)

超时+错误
标准思路
⾸先深度优先搜索判断它有⼏个连通分量。如果有多个,那就输出Error: x components,如果只
有⼀个,就两次深度优先搜索,先从⼀个结点dfs后保留最⾼⾼度拥有的结点们,然后从这些结点中的其中任意⼀个开始dfs得到最⾼⾼度的结点们,这两个结点集合的并集就是所求

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + 10;
vector<int> G[maxn];
int visit[maxn] = { 0 };
set<int> ans;
int n,Max = -1;
//深度遍历求高度
void dfs(int k, int d) {
	visit[k] = 1;
	/*if (G[k].size() == 1) {
		if (d > Max) {
			ans.clear();
			ans.insert(k);
			Max = d;
		}
		else if (d == Max) { ans.insert(k); }
	}*/
	for (int i = 0; i < G[k].size(); i++) {
		if (visit[G[k][i]] == 0) {
			dfs(G[k][i], d + 1);
		}
	}
	if (d > Max) {
		ans.clear();
		ans.insert(k);
		Max = d;
	}
	else if (d == Max) { ans.insert(k); }
}
//并查集确定子图数
int father[maxn];
int findFather(int x) {
	while(x != father[x]) {
		x = father[x];
	}
	return x;
}
void merge(int a, int b) {
	int Fa = findFather(a);
	int Fb = findFather(b);
	if (Fa != Fb) {
		father[Fa] = Fb;
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) { father[i] = i; }
	for (int i = 1; i < n; i++) {
		int p, q;
		cin >> p >> q;
		merge(p, q);
		G[p].push_back(q);
		G[q].push_back(p);
	}
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		if (father[i] == i) { cnt++; }//使用并查集会导致第二点错误,不知道为什么
	}
	if (cnt != 1) {
		cout << "Error: " << cnt << " components";
		return 0;
	}
	for (int i = 1; i <= n; i++) {
		fill(visit, visit + maxn, 0);
		if (G[i].size() == 1) { dfs(i, 0); }//只有度为1的点才有可能是所求点
	}
	for (auto i : ans) { cout << i << endl; }
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值