美文网首页
并查集模板

并查集模板

作者: MambaHJ | 来源:发表于2018-10-17 22:45 被阅读11次

以PAT甲级1114为例,写了个并查集模板,记录下来。题目就不列了,感兴趣去官网找一下

#include <cstdio>
#include <algorithm>
using namespace std;
static const int MAX = 10000;
static const int NUM_CHILD = 5;

struct Data{    /*存放输入数据的结构体*/
    int id, fa, mo, k, m, area;
    int child[NUM_CHILD]; 
}data[MAX];

struct node{
    int id, num;
    double house, area, aveHouse, aveArea; 
}node[MAX];

struct UF{
    int num[MAX], fa[MAX];
    void init(){
        for (int i = 0; i < MAX; ++i){
            fa[i] = i;
            num[i] = 1;
        }
    }
    int find_root(int u){
        if (fa[u] != u){
            fa[u] = find_root(fa[u]);
        }   
        return fa[u];
    }
    void Union(int x, int y){
        int fx = find_root(x);
        int fy = find_root(y);
        if (fx > fy){
            fa[fx] = fy;
            num[fy] += num[fx];
        }else if (fx < fy){
            fa[fy] = fx;
            num[fx] += num[fy];
        }
    }
}uf;
bool visited[MAX] = {false};

bool cmp(struct node a, struct node b){
    if (a.aveArea != b.aveArea){
        return a.aveArea > b.aveArea;
    }else{
        return a.id < b.id;
    }
}

int main(int argc, char const *argv[]){
    int n;
    uf.init();
    scanf("%d", &n);
    for (int i = 0; i < n; ++i){
        scanf("%d%d%d%d", &data[i].id, &data[i].fa, &data[i].mo, &data[i].k);
        if (data[i].fa != -1){
            uf.Union(data[i].fa, data[i].id);
        }
        if (data[i].mo != -1){
            uf.Union(data[i].mo, data[i].id);
        }
        for (int j = 0; j < data[i].k; ++j){
            scanf("%d", &data[i].child[j]);
            uf.Union(data[i].child[j], data[i].id);
        }
        scanf("%d%d", &data[i].m, &data[i].area);
    }
    int count = 0;
    for (int i = 0; i < n; ++i){
        int id = uf.find_root(data[i].id);
        if(!visited[id]){
            count++;
            visited[id] = true;
        }
        node[id].id = id;
        node[id].num = uf.num[id];
        node[id].house += data[i].m;
        node[id].area += data[i].area;
    }
    for (int i = 0; i < n; ++i){
        int id = uf.find_root(data[i].id);
        if (visited[id]){
            node[id].aveHouse = node[id].house / node[id].num;
            node[id].aveArea = node[id].area / node[id].num;
        }
    }
    printf("%d\n", count);
    sort(node, node+10000, cmp);
    for (int i = 0; i < count; ++i){
        printf("%04d %d %.3f %.3f\n", node[i].id, node[i].num, node[i].aveHouse, node[i].aveArea);
    }
    return 0;
}

相关文章

  • 模板

    并查集模板

  • LeetCode 分类刷题 —— Union Find

    Union Find 的 Tips: 灵活使用并查集的思想,熟练掌握并查集的模板,模板中有两种并查集的实现方式,一...

  • 并查集模板

    以PAT甲级1114为例,写了个并查集模板,记录下来。题目就不列了,感兴趣去官网找一下

  • 并查集模板

  • 并查集模板

  • 并查集模板

    并查集学习可查看网站[https://oi-wiki.org/ds/dsu/]

  • luogu P1551 亲戚(并查集入门)

    这是一个并查集模板。 说一下并查集,虽然我也是刚刚学会没几天。。。 并查集是个树形结构的数据结构,主要用于合并两个...

  • 并查集专题整理

    kuangbin专题 模板 关于并查集的一点心得 大家都说带权并查集的起点是食物链( POJ - 1182 ),但...

  • markdown学习

    #并查集 ##并查集的定义 ##并查集的操作

  • 并查集

    并查集在LeetCode周赛里面经常会用到,所以可以准备好模板以节省比赛做题时间。以下并查集类Python3实现修...

网友评论

      本文标题:并查集模板

      本文链接:https://www.haomeiwen.com/subject/qgydzftx.html