Ural 1671 Anansi's Cobweb

来源:互联网 发布:算法研究员 编辑:程序博客网 时间:2024/06/12 00:22

并查集水题,倒序进行即可。很久没写并查集了,写的极挫。

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define N 100005int r[N][2];int d[N];int par[N];int a[N];int sum[N];int n,m;int Find(int rt){    if(par[rt]==rt)return rt;    return par[rt]=Find(par[rt]);}int uni(int x,int y){    int x0,y0;    x0=Find(x);    y0=Find(y);    if(x0>y0)    {        par[x0]=y0;        return 1;    }    else if(x0<y0)    {        par[y0]=x0;        return 1;    }    return 0;}int main(){    scanf("%d%d",&n,&m);    int x,y;    for(int i=1;i<=m;i++)    {        scanf("%d%d",&r[i][0],&r[i][1]);    }    int num;    memset(a,0,sizeof(a));    for(int i=1;i<=n;i++)        par[i]=i;    scanf("%d",&num);    for(int i=1;i<=num;i++)    {        scanf("%d",&d[i]);        a[d[i]]=1;    }    for(int i=1;i<=m;i++)    {        if(a[i]!=1)        {            uni(r[i][0],r[i][1]);        }    }    memset(sum,0,sizeof(sum));    for(int i=1;i<=n;i++)        if(par[i]==i)sum[num]++;    for(int i=num;i>=1;i--)    {        sum[i-1]=sum[i]-uni(r[d[i]][0],r[d[i]][1]);    }    for(int i=1;i<=num;i++)        printf("%d ",sum[i]);    printf("\n");    return 0;}