【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;
}
}

浙公网安备 33010602011771号