标签:并查集
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
因为是中文题目 就不翻译了
大概思路就是并查集 根据给出的信息建立集合 最后每两个相邻的点查找是否在一个集合中 不在则结果道路+1 并放入同一集合中 最后输出结果
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 10000;
int N, M;
int pre[maxn];
int ans;
void join(int a, int b);
int _find(int n);
int main(){
while(scanf("%d", &N)!=EOF && N){
scanf("%d", &M);
ans = 0;
for(int i = 1; i <= N; ++i){ //赋初值
pre[i] = i;
}
for(int i = 1; i <= M; ++i){
int a, b;
scanf("%d%d", &a, &b);
join(a, b);
}
for(int i = 1; i < N; ++i){
if(_find(i) != _find(i+1)){ //如果不在一个集合 则不存在畅通的道路
++ans; //道路+1
join(i, i+1); //两个点放入同一集合中
}
}
printf("%d\n", ans);
}
return 0;
}
int _find(int n){ //寻找根节点
return pre[n] == n ? n : _find(pre[n]);
}
void join(int a, int b){ //如果不在一个集合中 则加入此集合
a = _find(a);
b = _find(b);
if(a != b){
pre[a] = b;
}
}
标签:并查集
原文地址:http://blog.csdn.net/u012431590/article/details/45440431