【1021 25 连通块 最长链】 Deepest Root

传送门

题意

给定一个 \(n\) , 表示树中的节点个数,给出 \(n-1\) 条边,如果不是树就输出 Error: K components\(K\) 是连通分量的个数,如果是树就输出高度最高的任意一个根结点存在多个时升序输出

数据范围

\(1\leq n\leq 10^{4}\)

题解

  • dfs 判断联通块个数
  • 为根高度最大的点只能是入度或出度为 0 的点
    • 任意点开始 dfs 一次后将深度最大的存下即出度为 0 的点,
    • 再以任意一个深度最大的 dfs 一次,可以存下入度为 0 的点,然后取并集即答案

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 1e4 + 10;

vector<vector<int>> edge(N);
int max_height = 0;
vector<bool> visit;
vector<int> vertices;

void dfs(int v, int height) {
	
	if (height > max_height) {
		vertices.clear();
		vertices.push_back(v);
		max_height = height;
	} else if (height == max_height) {
		vertices.push_back(v);
	}
	visit[v] = true;
	for (auto& to : edge[v]) {
		if (not visit[to]) {
			dfs(to, height + 1);
		}
	}
}
int main() {
	int n; cin >> n;
	visit.resize(n);
	for (int i = 0; i < n - 1; i++) {
		int u, v; cin >> u >> v;
		u--; v--;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}

	int block = 0;
	for (int i = 0; i < n; i++) {
		if (not visit[i]) {
			dfs(i, 0);
			block++;
		}
	}

	if (block > 1) {
		cout << "Error: " << block << " components";
		return 0;
	} 

	vector<int> ans;
	int max_vertice;
	for (int i = 0; i < vertices.size(); i++) {
		if (not i) max_vertice = vertices[i];
		ans.push_back(vertices[i]);
 	}
 	fill(visit.begin(), visit.end(), false);
 	dfs(max_vertice, 0);

 	for (int i = 0; i < vertices.size(); i++) {
 		ans.push_back(vertices[i]);
 	}
 	sort(ans.begin(), ans.end());
 	ans.erase(unique(ans.begin(), ans.end()), ans.end());
 	for (int i = 0; i < ans.size(); i++) {
 		if (i) cout << endl;
 		cout << ans[i] + 1;
 	}
}	
posted @ 2021-02-12 18:47  Hyx'  阅读(53)  评论(0)    收藏  举报