您的位置:首页 > 其它

1671. Anansi's Cobweb(并查集)

2013-09-24 16:56 204 查看
1671

并查集 对于询问删除边之后的连通块 可以倒着加边 最后再倒序输出

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define N 100010
int p
,father
,a,b,f
;
int pp
;
struct node
{
int x,y;
}ed
;
int find(int x)
{
if(father[x]!=x)
father[x] = find(father[x]);
return father[x];
}
void add(int a,int b)
{
int x = find(a);
int y = find(b);
if(x!=y)
father[x] = y;
}
int main()
{
int i,n,m,q;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(f,0,sizeof(f));
for(i =1; i <= n ; i++)
father[i] = i;
for(i = 1; i <= m ; i++)
{
scanf("%d%d",&ed[i].x,&ed[i].y);
}
scanf("%d",&q);
for(i = 1; i <= q ;i++)
{
scanf("%d",&p[i]);
f[p[i]] = 1;
}
for(i = 1; i <= m ; i++)
{
if(!f[i])
add(ed[i].x,ed[i].y);
}
int num = 0;
for(i = 1; i <= n ; i++)
if(father[i]==i)
num++;
pp[1] = num;
int o = 1;
for(i = q ; i>1 ; i--)
{
int x = find(ed[p[i]].x);
int y = find(ed[p[i]].y);
if(x==y)
{
pp[++o] = num;
continue;
}
else
{
father[x] = y;
num--;
pp[++o] = num;
}
}
for(i = o ; i > 1 ; i--)
printf("%d ",pp[i]);
printf("%d\n",pp[1]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: