HDU 4496 D-City

来源:互联网 发布:软件皮肤下载 编辑:程序博客网 时间:2024/06/02 10:49

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=4496

题意:

给出一张图,求按输入顺序去掉边之后整个图被分为几部分。

思路:

就是求删边之后的联通分量,因为删到最后一定是n部分,可以倒序加边,用并查集判断就行了。能合并两部分那么删去这条变一定能分成两部分。主要就是想到倒着来,也是签到题。

代码:

#define N 112345int n,m;int a[N],b[N],res[N];int f[N];void init(int n){    for(int i=0;i<=n;i++)        f[i]=i;}int getf(int v){    while(f[v] != v)    {        f[v]=f[f[v]];        v = f[v];    }    return f[v];}bool unions(int x,int y){    x = getf(x);    y = getf(y);    if(x == y) return true;    f[y] = x;    return false;}int main(){    int i,j,k,kk,t,x,y,z;    while(scanf("%d%d",&n,&m)!=EOF&&n)    {        init(n);        for(i=0;i<m;i++)            scanf("%d%d",&a[i],&b[i]);        res[m]=n;        for(i=m-1;i>=0;i--)        {            if(!unions(a[i]+1,b[i]+1))                res[i]=res[i+1]-1;            else                res[i]=res[i+1];        }        for(i=1;i<=m;i++)            printf("%d\n",res[i]);    }    return 0;}











0 0