hdu 4496 D-City (并查集)

来源:互联网 发布:mac安装exe软件 编辑:程序博客网 时间:2024/04/30 17:36

题意:

题目的意思就是 给你几条边几个点,然后建树,之后依次拆边,问你每次拆完边之后还剩几个独立的点

思路:

先用数组存图,然后从后往前建边,从后往前建i条边就等于从前往后删m-i条边吗

上代码:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int n,m;struct node {int s,e;}pre[100002];int p[10003],ans[100002];int getf(int x){return p[x]==x?x:p[x]=getf(p[x]);}void init(){for(int i=0;i<=n;i++){p[i]=i;}}int main(){while(scanf("%d%d",&n,&m)!=EOF){init();int sum=0;memset(pre,0,sizeof(pre));for(int i=1;i<=m;i++){scanf("%d%d",&pre[i].s,&pre[i].e);}ans[m]=n;for(int i=m;i>=1;i--){int dx=getf(pre[i].s);int dy=getf(pre[i].e);if(dx!=dy){sum++;p[dx]=dy;}ans[i-1]=n-sum;}for(int i=1;i<=m;i++){printf("%d\n",ans[i]);}}}