2013吉林通化邀请赛 1004 D-City 并查集求连通分支数
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4496
将题目要查询的数倒过来求,先加一条边,保存cc(连通分支数) 然后再加一条边....
当合并两个等价类的时候连通分支减1
代码:
#include<set> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int p[10000]; int u[100000]; int v[100000]; int ans[100000]; int find(int x) { return p[x]==x?x:p[x]=find(p[x]); } int main() { int n,m; int a,b; while(cin>>n>>m) { for(int i=0;i<n;i++) p[i]=i; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); u[i]=a; v[i]=b; } reverse(u,u+m); reverse(v,v+m); int cc=n; for(int i=0;i<m;i++) { int x=find(u[i]); int y=find(v[i]); if(x!=y) { p[x]=y; cc--; } ans[i]=cc; } for(int i=m-2;i>=0;i--) printf("%d\n",ans[i]); printf("%d\n",n); } }