并查集可同時檢測環與連通性。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
int fa[MAXN];
bool hasEdge[MAXN];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int u, v, caseNo = 1;
while (cin >> u >> v) {
if (u == -1 && v == -1) break;
fill(fa, fa + MAXN, 0);
fill(hasEdge, hasEdge + MAXN, false);
bool isTree = true;
int nodes = 0;
auto init = [&](int x) {
if (!hasEdge[x]) { hasEdge[x] = true; fa[x] = x; nodes++; }
};
while (u != 0 || v != 0) {
init(u); init(v);
int fu = find(u), fv = find(v);
if (fu == fv) isTree = false; // 成環
else fa[fu] = fv;
cin >> u >> v;
}
// 統計根
int roots = 0;
for (int i = 1; i < MAXN; ++i)
if (hasEdge[i] && find(i) == i) roots++;
if (roots != 1) isTree = false; // 空圖 roots=0 視為樹
if (nodes == 0) isTree = true; // 空樹
cout << "Case " << caseNo++ << " is " << (isTree ? "" : "not ") << "a tree.\n";
}
return 0;
}
HDU 1272 只需輸出 `Yes`/`No`,且節點編號上限 105,邏輯完全相同,調整數組大小與輸出格式即可。