并查集练习1:HDOJ1213
来源:互联网 发布:p2p网络正在连接 编辑:程序博客网 时间:2024/05/22 03:23
基础的并查集练习,可以水过。
quick find :
直接循环改数,时间复杂度为N方。
#include <iostream>using namespace std;int id[1005] ;void unionroot(int a, int b, int N );int main(){ int T=0 ; cin >> T ; while(T--) { int N = 0,M = 0, num = 0; int a , b ; cin >> N >> M ; for(int i=1 ; i<=N ; i++) id[i] = i; while(M--) { cin >> a >> b ; unionroot(a, b, N); } for(int i=1 ; i<=N ; i++) if(i==id[i]) num++; cout << num << endl ; } return 0;}void unionroot(int a, int b, int N ){ int idp = id[a] ; int idq = id[b] ; for(int i = 1 ; i <= N ; i++) if(id[i]==idp) id[i] = idq ;}
#include <iostream>using namespace std;int id[1005] ;void unionroot(int a, int b, int N );int findroot(int a);int main(){ int T=0 ; cin >> T ; while(T--) { int N = 0,M = 0, num = 0; int a , b ; cin >> N >> M ; for(int i=1 ; i<=N ; i++) id[i] = i; while(M--) { cin >> a >> b ; unionroot(a, b, N); } for(int i=1 ; i<=N ; i++) if(i==id[i]) num++; cout << num << endl ; } return 0;}void unionroot(int a, int b, int N ){ int idp = findroot(a) ; int idq = findroot(b) ; id[idp] = idq ;}int findroot(int a){ while(a!=id[a]) { a = id[a] ; } return a ;}
weighted quick union :
#include <iostream>#include <string.h>using namespace std;int id[1005] ;int weight[1005] ;void unionroot(int a, int b, int N );int findroot(int a);int main(){ int T=0 ; cin >> T ; while(T--) { int N = 0,M = 0, num = 0; int a , b ; cin >> N >> M ; memset(weight, 1, sizeof(int)); for(int i=1 ; i<=N ; i++) id[i] = i; while(M--) { cin >> a >> b ; unionroot(a, b, N); } for(int i=1 ; i<=N ; i++) if(i==id[i]) num++; cout << num << endl ; } return 0;}void unionroot(int a, int b, int N ){ int idp = findroot(a) ; int idq = findroot(b) ; if(weight[idq] <= weight[idp]) { id[idp] = idq ; weight[idq] += weight[idp] ; } else { id[idq] = idp ; weight[idp] += weight[idq] ; }}int findroot(int a){ while(a!=id[a]) { a = id[a] ; } return a ;}
path compression:只在寻找根节点的同时加了一句提升根节点。
#include <iostream>#include <string.h>using namespace std;int id[1005] ;int weight[1005] ;void unionroot(int a, int b, int N );int findroot(int a);int main(){ int T=0 ; cin >> T ; while(T--) { int N = 0,M = 0, num = 0; int a , b ; cin >> N >> M ; memset(weight, 1, sizeof(int)); for(int i=1 ; i<=N ; i++) id[i] = i; while(M--) { cin >> a >> b ; unionroot(a, b, N); } for(int i=1 ; i<=N ; i++) if(i==id[i]) num++; cout << num << endl ; } return 0;}void unionroot(int a, int b, int N ){ int idp = findroot(a) ; int idq = findroot(b) ; if(weight[idq] <= weight[idp]) { id[idp] = idq ; weight[idq] += weight[idp] ; } else { id[idq] = idp ; weight[idp] += weight[idq] ; }}int findroot(int a){ while(a!=id[a]) { id[a] = id[id[a]]; a = id[a] ; } return a ;}
0 0
- 并查集练习1:HDOJ1213
- HDOJ1213并查集
- hdoj1213 How many tables?(并查集)
- HDOJ1213 How Many Tables(并查集)
- hdoj1213和zoj2833 (简单并查集)
- 【HDOJ1213】How Many Tables[并查集模板题]
- HDOJ1213. How many tables(并查集连通块计数)
- 并查集练习
- 并查集练习---poj 1417 并查集+DP
- hdoj1213
- 并查集专题练习(一)POJ1611
- 并查集练习---poj 1182 食物链
- 并查集练习---poj 1984
- 并查集练习---poj 2912
- 并查集及 编程练习
- 并查集入门水题练习
- Friend解题报告 - 并查集练习
- 编程练习四(并查集)
- 从二维数组中取出最小3个元素
- 怎样的数据报表才能将公司全部业务数据整合在一起
- vue + vue-touch 来实现移动端左右导航效果(有点像京东移动站导航)
- 跟我学JavaScript--字符串
- WebView与Javascript交互
- 并查集练习1:HDOJ1213
- JS学习笔记——AngularJS 1.x双向数据绑定机制
- sokcet链接详解--来自简书
- $.ajax
- 进程与线程
- SVN服务器的本地搭建和使用
- 使用XUL开发跨平台桌面应用
- mysql查看是否使用索引
- 操作符的重载和模板的使用