并查集有什么用
用于判断连通性——组成联通块族系问题
代码
#include <iostream>
#define ll long long
using namespace std;
int father[5010];
void initial(int n) {
for(int i=0; i <= n; i++) father[i] = i;
}
int find(int x) {
return x == father[x] ? x : father[x] = find(father[x]);
}
bool isSame(int x, int y) {
return find(x) == find(y);
}
void my_union(int x, int y) {
x = find(x);
y = find(y);
father[x] = y;
return;
}
int main()
{
int n, m, p;
cin >> n >> m >> p;
initial(n);
for(int i=0; i<m; i++)
{
int j, k;
cin >> j >> k;
my_union(j, k);
}
for(int i=0; i<p; i++)
{
int j, k;
cin >> j >> k;
cout<< (isSame(j,k) ? "Yes":"No") << endl;
}
return 0;
}
class UF {
private int count;
private int[] parent;
private int[] size;
public UF(int size) {
this,count = size;
parent = new int[size];
this.size = size;
for (int i = 0; i < size(); i++) {
parent[i] = i;
size[i] = 1;
}
}
public void union(int p, int q) {
int rootP = find(p);
int rootQ = find(q);
if (rootP == rootQ) return;
if (size[rootP] > size[rootQ]) {
parent[rootQ] = rootP;
size[rootP] += size[rootQ];
} else {
parent[rootP] = rootQ;
size[rootQ] += size[rootP];
}
count--;
}
public boolean connected(int p, int q) {
return find(p) == find(q);
}
public int find(int t) {
while (parent[t] != t) {
parent[t] = parent[parent[t]];
t = parent[t];
}
}
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-60184.html