笨-Archangel

导航

ACM HDU 1232 交通工程 并查集

#include<iostream>
#include<cstdio>
using namespace std;
int city[1005];
int sum;
int find(int x)
{
    int r=x;
    while(city[r]!=r)
    {
        r=city[r];
    
    }
    return r;
}
void mege(int x,int y)
{
    int fx,fy;
    fx=find(x);
    fy=find(y);
    if(fx!=fy)
    {   
        if(fx>fy)
        city[fx]=fy;
        else city[fy]=fx;

        sum++;
    }

}
int main()
{
    int Tc;int Tr;
    while(scanf("%d",&Tc)&&Tc)
    {
        int i=1;
        sum=0;
        for(;i<=Tc;i++)
            city[i]=i;
        scanf("%d",&Tr);
        int l,r;
        int x,y;
        for(i=0;i<Tr;i++)
        {
            scanf("%d%d",&l,&r);
            x=find(l);
            y=find(r);
            if(x>y)
            city[x]=y;
            else city[y]=x;
        }
        for(i=1;i<=Tc-1;i++)
        {
            mege(i,i+1);
        }
        cout<<sum<<endl;


    }
    return 0;
}

哈哈,经过老师的指导和本人的努力,以及热心网友的帮助。。。。我终于又A一题,这个并查集做的,而且由于算法复杂度不高,我进行了合并树(特别指明。。。一定要用一棵树的根 接到另一棵树(根或节点都可以),(本人SB了一个晚上,将一颗树的子树接都另一棵树,结果头爆了一个晚上,最后一位热心网友出现后。。。。TAT,感动~~~~~~~~)

posted on 2012-04-11 16:46  笨-Archangel  阅读(117)  评论(0)    收藏  举报