标签:并查集
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