文章

4

粉丝

0

获赞

4

访问

613

头像
畅通工程2 题解:C语言/查并集/路径压缩且优化
P1319 浙江大学机试题
发布于2026年3月28日 14:23
阅读数 167


#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;
    ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发