题解 | 连通图
#include<iostream>
using namespace std;
const int MAX = 100;
void Initial(int S[], int length) {
for (int i = 0; i < length; i++) {
S[i] = -1;
}
}
// 优化FInd
int Find(int S[], int x) {
int root = x;
while (S[root] >= 0) {
root = S[root];
}
int temp = S[x];
while (S[x] >= 0) {
S[x] = root;
x = temp;
temp = S[x];
}
return root;
}
// 优化Union
void Union(int S[], int x, int y) {
int Root1 = Find(S, x);
int Root2 = Find(S, y);
if (Root1 == Root2) {
return;
}
if (S[Root1] < S[Root2]) {
S[Root1] += S[Root2];
S[Root2] = Root1;
} else {
S[Root2] += S[Root1];
S[Root1] = Root2;
}
}
int main() {
int n, m;
while (cin >> n >> m) {
if (n == 0 && m == 0) {
break;
}
int* S = (int*)malloc(sizeof(int) * (n + 1)); // S[0]不使用
Initial(S, n + 1);
int x, y;
for (int i = 0; i < m; i++) {
cin >> x >> y;
Union(S, x, y);
}
// 判断并查集中是否只有一个集合
int count = 0;
for (int i = 1; i < n + 1; i++) {
if (S[i] < 0) {
count++;
}
}
if (count > 1) {
cout << "NO" << endl;
} else {
cout << "YES" << endl;
}
}
}
通过并查集判断无向图的连通问题

查看11道真题和解析