1671. Anansi's Cobweb(并查集)
2013-09-24 16:56
204 查看
1671
并查集 对于询问删除边之后的连通块 可以倒着加边 最后再倒序输出
View Code
并查集 对于询问删除边之后的连通块 可以倒着加边 最后再倒序输出
#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
相关文章推荐
- URAL1671 Anansi's Cobweb(离线做 + 并查集)
- Ural_1671. Anansi's Cobweb(并查集)
- URAL1671 Anansi's Cobweb(离线做 + 并查集)
- ural 1671 Anansi's Cobweb-并查集
- Ural 1671. Anansi's Cobweb(并查集)
- ural 1671 Anansi's Cobweb
- Ural 1671. Anansi's Cobweb(并查集)
- URAL 1671 Anansi's Cobweb (并查集)
- Ural 1671 - Anansi's Cobweb 倒过来做...并查集维护..
- Ural 1671. Anansi's Cobweb
- Ural 1671 Anansi's Cobweb
- Ural 1671 Anansi's Cobweb
- 九度OJ 1446 Head of a Gang -- 并查集
- 51nod 1204:Parity 并查集
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)C. Destroying Array(想法题/并查集)
- 并查集及例题题解
- 并查集
- 并查集入门 hud1213 poj2236
- poj2524 Ubiquitous Religions(并查集求组数)
- HDU 5606_基础并查集