zoukankan      html  css  js  c++  java
  • P5089 [eJOI2018]元素周期表(并查集)

    传送门

    以后看到棋盘要么黑白染色要么二分图!
    我们考虑对行列建二分图,如果(i)(j)列有,就把(i)(j+n)连起来
    我们要让它变成一张完全二分图。考虑条件((i_1,j_1+n),(i_1,j_2+n),(i_2,j_1+n)->(i_2,j_2+n))
    然后发现并不会改变二分图里连通块的数量
    于是答案就是连通块个数-1,并查集就可以了

    //minamoto
    #include<bits/stdc++.h>
    #define R register
    #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
    #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    using namespace std;
    char buf[1<<21],*p1=buf,*p2=buf;
    inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    int read(){
        R int res,f=1;R char ch;
        while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
        for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
        return res*f;
    }
    const int N=5e5+5;
    int fa[N],n,m,q,x,y,ans;
    int find(R int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    int main(){
    //	freopen("testdata.in","r",stdin);
        n=read(),m=read(),q=read(),ans=n+m-1;
        fp(i,1,n+m)fa[i]=i;
        while(q--){
            x=read(),y=read()+n;
            if((x=find(x))!=(y=find(y)))fa[x]=y,--ans;
        }printf("%d
    ",ans);return 0;
    }
    
  • 相关阅读:
    YTU 2543: 数字整除
    YTU 2542: 弟弟的作业
    YTU 2541: 汽水瓶
    YTU 2535: C++复数运算符重载(+与<<)
    YTU 2530: 小勇玩lol
    YTU 2520: 小慧唱卡拉OK
    YTU 2517: 打倒魔王↖(^ω^)↗
    YTU 2516: 剪刀石头布
    reload、replace、href、assign、window.history.go(0)的区别
    js 数组排序sort方法
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/10114002.html
Copyright © 2011-2022 走看看