您的位置:首页 > 其它

畅通工程 problem c

2016-06-20 08:38 162 查看


某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

题目分析:

               并查集。所需要添加的边数=孤立点数-1.问题转化成使用并查集进行合并操作以后,还剩的孤立点数。

#include <iostream>  

#include <cstdio>  

  

using namespace std;  

  

const int maxn = 1001;  

  

  

int father[maxn];  

  

  

  

  

void init(){  

    int i;  

    for(i = 1 ; i < maxn ; ++i){  

        father[i] = i;  

    }  

}  

  

int find(int a){  

    if(a == father[a]){  

        return a;  

    }  

  

    return father[a] = find(father[a]);  

}  

  

void join(int a,int b){  

    int fa = find(a);  

    int fb = find(b);  

  

    if(fa != fb){  

        father[fa] = fb;//注意这里不能写成father[a] = b.否则会WA  

    }  

}  

  

  

  

int main(){  

    int n,m;  

    while(scanf("%d",&n)!=EOF,n){  

        scanf("%d",&m);  

  

        init();  

  

        int i;  

        for(i = 1 ; i <= m ; ++i){  

            int a,b;  

            scanf("%d%d",&a,&b);  

  

            join(a,b);  

        }  

  

        int cnt = 0;  

        for(i = 1 ; i <= n ; ++i){//遍历所有点  

            if(father[i] == i){//求孤立点的个数  

                cnt++;  

            }  

        }  

  

        printf("%d\n",cnt-1);//所需要件的边数就是孤立点数-1。  

    }  

  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: