文章
4
粉丝
0
获赞
4
访问
613
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 1010
int arr[M];//集
int d[M];//权值
void initial() {
for (int i = 0; i < M; i++) {
arr[i] = i;
d[i] = 1;
}
}
int find(int x) {//找祖先,同时该继承结构改为扁平结构
if (arr[x] != x) {
int t = find(arr[x]);//找x的最远祖先
arr[x] = t;//路径优化:将祖先改为父节点
return t;
}
return x;//返回自己
}
void find_merge(int a, int b) {//路径压缩
int x = find(a);
int y = find(b);
if (x == y)return;
if (d[x] > d[y]) {//小图插入大图中,并更改大图的权值(即节点数)
arr[y] = x;
d[x] += d[y];
}
else {
arr[x] = y;
d[y] += d[x];
}
}
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF && n != 0) {
initial();
for (int i = 0; i < m; i++) {
int p, q;
scanf("%d%d", &p, &q);
find_merge(p, q);
}
int ans = 0;
...
登录后发布评论
暂无评论,来抢沙发