首页 > 代码库 > BZOJ 3563 DZY Loves Chinese 并查集

BZOJ 3563 DZY Loves Chinese 并查集

题目大意:给定一个无向联通图,q次询问当图中某k条边消失时图是否联通 强制在线

逗比题233

不明白什么意思的去看DZY Loves Chinese II的红字就明白这题为何逗比了0.0

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct edges{
    int x,y;
}e[500500];
int n,m,q,block;
bool v[500500];
char s[1010];
int fa[M],ans[M];
int Find(int x)
{
    if(!fa[x]||fa[x]==x)
        return fa[x]=x;
    return fa[x]=Find(fa[x]);
}
void Unite(int x,int y)
{
    x=Find(x);y=Find(y);
    if(x==y) return ;
    fa[x]=y;block--;
}
int main()
{
    int i,j,k,_k;
    cin>>n>>m;
    for(i=1;i<=m;i++)
        scanf("%d%d",&e[i].x,&e[i].y);
    cin>>q;
    for(i=1;i<=q;i++)
    {
        scanf("%d",&_k);
        gets(s+1);k=0;
        for(j=1;s[j];j++)
            if( isdigit(s[j]) && !isdigit(s[j+1]) )
                ++k;
        ans[i]=k^_k;
    }
    for(i=1;i<q;i++)
        printf("%s\n",ans[i+1]-ans[i]?"Connected":"Disconnected");
    int temp=0;
    for(i=1,s[0]='a';s[i-1];i++)
    {
        if( isdigit(s[i]) )
            temp*=10,temp+=s[i]-'0';
        else if( isdigit(s[i-1]) )
            v[temp^ans[q]]=1,temp=0;
    }
    block=n;
    for(i=1;i<=m;i++)
        if(!v[i])
            Unite(e[i].x,e[i].y);
    puts(block==1?"Connected":"Disconnected");
    return 0;
}


BZOJ 3563 DZY Loves Chinese 并查集