hdu 4496 D-City 并查集

#include <stdio.h>
#include <string.h>
#define maxn 10050
int n,m;
int p[maxn],x[maxn*10],y[maxn*10];
int find(int x)
{
	if(p[x]==x) return x;
	else return p[x]=find(p[x]);
}
int link(int u,int v)
{
	int x,y;
	x=find(u);
	y=find(v);
	if(x==y) return 0;
	else { p[x]=y; return 1;}
}

int main()
{
	int ans[maxn*10],i,a,b;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(ans,0,sizeof(ans));
		int i,j;
		for(i=0;i<n;i++) p[i]=i;
		for(i=1;i<=m;i++)
			scanf("%d%d",&x[i],&y[i]);
		ans[m+1]=n;
		for(i=m;i>0;i--)
			ans[i]=ans[i+1]-link(x[i],y[i]);
		for(i=1;i<=m;i++)
			printf("%d\n",ans[i+1]);
	}
	return 0;
}


posted @ 2013-12-10 23:25  贝尔摩德  阅读(91)  评论(0编辑  收藏  举报