1. 程式人生 > >zcmu——4940: 暢通工程(並查集)

zcmu——4940: 暢通工程(並查集)

題目連結:

【分析】

模板之前都會

就是不會實際應用

還是題目做的太少了

這種題

至少要修幾條路

就是找有幾個連通分量

結果就是連通分量-1

還有如何把路的兩邊連在一起

其實就是用union模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 1010
int father[maxn];
void initial(int n)
{
    for(int i=1;i<=n;i++)
    {
        father[i]=i;
    }
}
int findFather(int x)
{
    while(x!=father[x])
        x=father[x];
    return x;
}
void Union(int a,int b)
{
    int faA=findFather(a);
    int faB=findFather(b);
    if(faA!=faB)
        father[faA]=faB;
}
int main()
{
    int m,n,x,y;
    while(~scanf("%d",&n)&&n!=0)
    {
        //scanf("%d",&m);
       initial(n);
       cin>>m;
        for(int i=1;i<=m;i++)
        {
           scanf("%d%d",&x,&y);
           Union(x,y);
        }
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(father[i]==i)
                cnt++;
        }
        printf("%d\n",cnt-1);
    }
    return 0;
}