九度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。思路正确。

 

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