博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1232畅通工程 并查集
阅读量:5309 次
发布时间:2019-06-14

本文共 4044 字,大约阅读时间需要 13 分钟。

并查集入门题。

数组结构code1:

#include
#define maxn 1005#define max(a,b) a>b?a:b#define min(a,b) a
<= n;i ++){ set[i] = i; ifhas[i] = 0; }}void Merge(int a,int b){ int big,small; big = max(set[a],set[b]); small= min(set[a],set[b]); for(int i = 1;i <= n;i ++) { if(set[i] == big){ set[i] = small; } }}int main(void){ while(cin >> n && n!=0) { init(); cin >> m; int i,j; for(i = 0;i < m;i ++){ cin >> s >> e; Merge(s,e); } int ans = 0; for(int i = 1;i <= n;i ++) { if(ifhas[set[i]] == 0){ ans ++; ifhas[set[i]] = 1; } } cout << ans - 1 << endl; } return 0;}

 树结构code2

#include 
#include
#define maxn 1005using namespace std;int set[maxn];void init(int n){ int i; for(i = 1;i <=n;i ++) { set[i] = i; }}int find(int x){ int fa = x; while(fa != set[fa]) fa = set[fa]; return fa;}void merge(int a,int b){ int fa,fb; fa = find(a); fb = find(b); set[fb] = fa;}int main(){ int n,m,a,b; while(cin >> n && n!= 0) { init(n); cin >> m; for(int i = 1;i <= m;i ++){ cin >> a >> b; merge(a,b); } for(int i = 1;i <= n;i ++){ set[i] = find(i); //cout << "set[" << i << "]=" << set[i] << endl; } int ans = 0; for(int i = 1;i <= n;i ++) { if(set[i] == i){ ans ++; } } cout << ans - 1 << endl; } return 0;}

树结构(优化,深度小的移到深度大的)

#include 
#include
#define maxn 1005using namespace std;int set[maxn];int height[maxn];void init(int n){ int i; for(i = 1;i <=n;i ++) { set[i] = i; height[i] = 1; }}int find(int x){ int fa = x; while(fa != set[fa]) fa = set[fa]; return fa;}void merge(int a,int b){ int fa,fb; fa = find(a); fb = find(b); if(height[fa] > height[fb]){ set[fb] = fa; } else if(height[fb] > height[fa]){ set[fa] = fb; } else{ set[fb] = fa; height[fa] ++; }}int main(){ int n,m,a,b; while(cin >> n && n!= 0) { init(n); cin >> m; for(int i = 1;i <= m;i ++){ cin >> a >> b; merge(a,b); } for(int i = 1;i <= n;i ++){ set[i] = find(i); //cout << "set[" << i << "]=" << set[i] << endl; } int ans = 0; for(int i = 1;i <= n;i ++) { if(set[i] == i){ ans ++; } } cout << ans - 1 << endl; } return 0;}

树结构(优化,深度小的移到深度大的 + 路径压缩)

#include 
#include
#define maxn 1005using namespace std;int set[maxn];int height[maxn];void init(int n){ int i; for(i = 1;i <=n;i ++) { set[i] = i; height[i] = 1; }}int find(int x){ int fa = x; int j,i; while(fa != set[fa]) fa = set[fa]; i = x; while(i != fa) { j = set[i]; set[j] = fa; i = j; } return fa;}void merge(int a,int b){ int fa,fb; fa = find(a); fb = find(b); if(height[fa] > height[fb]){ set[fb] = fa; } else if(height[fb] > height[fa]){ set[fa] = fb; } else{ set[fb] = fa; height[fa] ++; }}int main(){ int n,m,a,b; while(cin >> n && n!= 0) { init(n); cin >> m; for(int i = 1;i <= m;i ++){ cin >> a >> b; merge(a,b); } for(int i = 1;i <= n;i ++){ set[i] = find(i); //cout << "set[" << i << "]=" << set[i] << endl; } int ans = 0; for(int i = 1;i <= n;i ++) { if(set[i] == i){ ans ++; } } cout << ans - 1 << endl; } return 0;}

 

转载于:https://www.cnblogs.com/zhangjialu2015/p/5341582.html

你可能感兴趣的文章
[LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
查看>>
[Cypress] Stub a Post Request for Successful Form Submission with Cypress
查看>>
程序集的混淆及签名
查看>>
判断9X9数组是否是数独的java代码
查看>>
00-自测1. 打印沙漏
查看>>
UNITY在VS中调试
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
Scala入门(1)Linux下Scala(2.12.1)安装
查看>>
如何改善下面的代码 领导说了很耗资源
查看>>
Quartus II 中常见Warning 原因及解决方法
查看>>
php中的isset和empty的用法区别
查看>>
Android ViewPager 动画效果
查看>>
pip和easy_install使用方式
查看>>
博弈论
查看>>
Redis sentinel & cluster 原理分析
查看>>
我的工作习惯小结
查看>>
把word文档中的所有图片导出
查看>>
浏览器的判断;
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
Leetcode 589. N-ary Tree Preorder Traversal
查看>>