美文网首页
0x41并查集

0x41并查集

作者: burningrain | 来源:发表于2021-02-14 14:27 被阅读0次

程序自动分析
并查集+离散化

#include<bits/stdc++.h>
using namespace std;
int a[2000005];
int fa[200005];
struct node{
    int x,y,e;
}Node[1000005];
int get(int x){
    if(x==fa[x]) return x;
    return fa[x]=get(fa[x]);
}
void merge(int x,int y){
    fa[get(x)]=get(y);
}
int main(){
    int t;
    cin>>t;
    while(t--){
        for(int i=1;i<=200005;i++) fa[i]=i;
        int n;
        cin>>n;
        int num=1;
        for(int i=1;i<=n;i++){
            cin>>Node[i].x>>Node[i].y>>Node[i].e;
            a[num++]=Node[i].x,a[num++]=Node[i].y;
        }
        num--;
        //离散化
        sort(a+1,a+1+num);
        int m=unique(a+1,a+num+1)-(a+1);
        for(int i=1;i<=n;i++){
            Node[i].x=lower_bound(a+1,a+1+m,Node[i].x)-a;
            Node[i].y=lower_bound(a+1,a+1+m,Node[i].y)-a;
        }
        //---
        for(int i=1;i<=n;i++){
            if(Node[i].e==1)
                merge(Node[i].x,Node[i].y);
        }
        bool flag=true;
        for(int i=1;i<=n;i++){
            if(Node[i].e==0){
                int res1=get(Node[i].x);
                int res2=get(Node[i].y);
                if(res1==res2){
                    flag=false;
                    cout<<"NO"<<endl;
                    break;
                }
            }
        }
        if(flag){
            cout<<"YES"<<endl;
        }
    }
    return 0;
}

银河英雄传说
并查集+边带权

#include<bits/stdc++.h>
using namespace std;
int fa[60005];
int d[60005];
int Size[60005];
int get(int x){
    if(x==fa[x]) return x;
    int root = get(fa[x]);
    d[x] += d[fa[x]];
    return fa[x] = root;
}
void merge(int x,int y){
    x=get(x),y=get(y);
    fa[x]=y;
    d[x]=Size[y];
    Size[y]+=Size[x];
}

int main(){
    int t;
    cin>>t;
    for(int i=1;i<=60000;i++) fa[i]=i,Size[i]=1,d[i]=0;
    while(t--){
        char x;
        int a,b;
        cin>>x>>a>>b;
        if(x=='M'){
            merge(a,b);
        }else{
            if(get(a)==get(b)){
                cout<<abs(d[a]-d[b])-1<<endl;
            }else{
                cout<<-1<<endl;
            }
        }
    }
    return 0;
}

相关文章

  • 0x41并查集

    程序自动分析[https://www.acwing.com/problem/content/description...

  • markdown学习

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

  • 算法模板(四)并查集

    并查集 路径压缩并查集

  • 并查集入门使用

    本文参考自《算法笔记》并查集篇 并查集的定义 什么是并查集?并查集可以理解为是一种维护数据集合的结构。名字中并查集...

  • 并查集练习

    并查集 参考《算法笔记》 三要素:并,查,集。 并差集与一个算法有关,kruskal算法,就可通过并查集实现。 1...

  • 并查集

    并查集 并查集是什么 并查集是一种用来管理元素分组情况的数据结构,并查集可以高效地进行如下操作: 查询元素a和元素...

  • 数据结构与算法(十二)并查集(Union Find)

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化Quick FindQuick Union基...

  • 并查集

    并查集是什么 并查集是一种用来管理元素分组情况的数据结构。并查集可以高效地进行如下操作。不过需要注意并查集虽然可以...

  • 并查集

    开始时让每个元素构成一个个单元素集合(注意初始化时应使每个元素各成一组)按照一定顺序将属于同一组元素所在的集合合并...

  • 并查集

网友评论

      本文标题:0x41并查集

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