1. 程式人生 > >(模板題)暢通工程

(模板題)暢通工程

HDU-暢通工程-1232

問題描述:

有n個點,有m個連線關係,求最少需要再建立的線段條數;

 

#include<iostream>
using namespace std;

const int maxn=1010;
int n,m,cnt,p,q;
int maze[maxn];

void init()
{
    for(int i=0;i<maxn;i++)
        maze[i]=i;
}

int my_find(int x)
{
    return x==maze[x]? x : my_find(maze[x]);
}

void my_union(int i,int j)
{
    int x=my_find(i);
    int y=my_find(j);
    if(x!=y)
    {
        maze[x]=y;
        cnt--;
    }
}

int main()
{
    while(cin>>n,n)//注意n和m的輸入方式,題目要求是n=0時就代表輸入結束,沒說m
    {
        cin>>m;
        init();
        cnt=n-1;//連線n個點,在不成環的情況下需要n-1條線段;
        for(int i=0;i<m;i++)
        {
            cin>>p>>q;
            my_union(p,q);
        }
        cout<<cnt<<endl;
    }
    return 0;
}

並查集