hdu 4496 D-City
2015-10-18 20:35
288 查看
并查集水题,给你一张图,问你删掉前I条边之后联通块的个数,倒着合并就可以了
#include<iostream> #define maxn 10010 using namespace std; int f[maxn]; struct stu { int a,b; }; stu mapp[maxn*10]; int re[maxn*10]; int n,m; int dfs(int x) { if(f[x]!=x) f[x]=dfs(f[x]); return f[x]; } int main() { cin.sync_with_stdio(false); while(cin>>n>>m) { for(int i=0;i<m;i++) cin>>mapp[i].a>>mapp[i].b; for(int i=0;i<=n;i++) f[i]=i; re[m]=n; int sum=n; for(int i=m-1;i>=0;i--) { int x=dfs(mapp[i].a); int y=dfs(mapp[i].b); if(x!=y) { f[x]=y; sum--; } re[i]=sum; } for(int i=1;i<=m;i++) cout<<re[i]<<endl; } return 0; }
相关文章推荐