某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
题目分析:
并查集。所需要添加的边数=孤立点数-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;
- }