畅通工程 problem c

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

题目分析:

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



  1. #include <iostream>  
  2. #include <cstdio>  
  3.   
  4. using namespace std;  
  5.   
  6. const int maxn = 1001;  
  7.   
  8.   
  9. int father[maxn];  
  10.   
  11.   
  12.   
  13.   
  14. void init(){  
  15.     int i;  
  16.     for(i = 1 ; i < maxn ; ++i){  
  17.         father[i] = i;  
  18.     }  
  19. }  
  20.   
  21. int find(int a){  
  22.     if(a == father[a]){  
  23.         return a;  
  24.     }  
  25.   
  26.     return father[a] = find(father[a]);  
  27. }  
  28.   
  29. void join(int a,int b){  
  30.     int fa = find(a);  
  31.     int fb = find(b);  
  32.   
  33.     if(fa != fb){  
  34.         father[fa] = fb;//注意这里不能写成father[a] = b.否则会WA  
  35.     }  
  36. }  
  37.   
  38.   
  39.   
  40. int main(){  
  41.     int n,m;  
  42.     while(scanf("%d",&n)!=EOF,n){  
  43.         scanf("%d",&m);  
  44.   
  45.         init();  
  46.   
  47.         int i;  
  48.         for(i = 1 ; i <= m ; ++i){  
  49.             int a,b;  
  50.             scanf("%d%d",&a,&b);  
  51.   
  52.             join(a,b);  
  53.         }  
  54.   
  55.         int cnt = 0;  
  56.         for(i = 1 ; i <= n ; ++i){//遍历所有点  
  57.             if(father[i] == i){//求孤立点的个数  
  58.                 cnt++;  
  59.             }  
  60.         }  
  61.   
  62.         printf("%d\n",cnt-1);//所需要件的边数就是孤立点数-1。  
  63.     }  
  64.   
  65.     return 0;  
  66. }  

你可能感兴趣的:(畅通工程 problem c)