九度1012 暢通工程---簡單並查集應用

題目描述:

    某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省政府“暢通工程”的目標是使全省任何兩個城鎮間都可以實現交通(但不一定有直接的道路相連,只要互相間接通過道路可達即可)。問最少還需要建設多少條道路?

輸入:

    測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是城鎮數目N ( < 1000 )和道路數目M;隨後的M行對應M條道路,每行給出一對正整數,分別是該條道路直接連通的兩個城鎮的編號。爲簡單起見,城鎮從1到N編號。 
    注意:兩個城市之間可以有多條道路相通,也就是說
    3 3
    1 2
    1 2
    2 1
    這種輸入也是合法的
    當N爲0時,輸入結束,該用例不被處理。

輸出:

    對每個測試用例,在1行裏輸出最少還需要建設的道路數目。

樣例輸入:
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
樣例輸出:
1
0
2
998
來源:
2005年浙江大學計算機及軟件工程研究生機試真題
答疑:
解題遇到問題?分享解題心得?討論本題請訪問:http://t.jobdu.com/thread-7736-1-1.html

 

#include <iostream>

using namespace std;
int id[1000];
int town;
int road;
int count; //統計等價集的個數

//給出等價集的組號
int find(int a)
{
  return id[a];
}
//合併等價集
void Union(int a, int b)
{
  int aID = find(a);
  int bID = find(b);
  int i;

  for(i = 1; i <= town; i++)
  {
    if(id[i] == bID)
		id[i] = aID;
	cout<<"id[i]"<<id[i]<<endl;
	
  }
   count--;
}

int main()
{ 
  int a,b;
  
  int i;
  while(1)
  {
   
    cin>>town>>road;
	if(town == 0)
		return 0;
    count = town;

  //對並查集初始化
  for(i = 1; i <= town; i++)
  {  
     id[i] = i;
  }

  //構造等價集
  for(i = 1; i <= road; i++)
  {
    cin>>a>>b;
	if(find(a) != find(b))
		Union(a,b);
  }
  
  cout<<--count<<endl;
  
  }
  return 0;
}


注:本題沒有AC。思路正確。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章