某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
中文题,不多描述。做法:并查集 或 bfs、dfs
# include <cstdio>
# include <cstring>
# include <iostream>
using namespace std;
const int MAXN = 1010 ;
int city[MAXN] ;
int find_root(int x) {
return (x == city[x])? x : city[x] = find_root(city[x]) ;
}
void Union(int x , int y) {
city[x] = find_root(x) ;
city[y] = find_root(y) ;
if (city[x] != city[y]) {
city[city[x]] = city[y] ;
}
}
int main() {
//freopen("in.txt" , "r" , stdin) ;
int n , m ;
while (scanf("%d" , & n) , n) {
memset(city , 0 , sizeof(city)) ;
for (int i = 1 ; i <= n ; i ++) {
city[i] = i ;
}
scanf("%d" , & m) ;
while (m -- ) {
int w1 , w2 ;
scanf("%d%d" , & w1 , & w2) ;
Union(w1 , w2) ;
}
int more_way = 0 ;
for (int i = 1 ; i <= n ; i ++) {
if (city[i] == i) more_way ++ ;
}
cout << more_way - 1 << endl ;
}
return 0 ;
}