【并查集 最小生成树两种模板(MST)】
2014-08-06 11:08
411 查看
题目链接 HDU1875
【分析】 MST模板
【kruskal算法 O(k*m) k为常数,并查集耗时】
【AC CODE】156ms
【prim算法 O(n^2)】
【codevs 1003】
【分析】 MST模板
【kruskal算法 O(k*m) k为常数,并查集耗时】
【AC CODE】156ms
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define MAXN 105 #define dis(a,b) (sqrt((double)(x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]))) struct NODE{ int a, b; double v; bool operator <(const NODE& t)const {return v < t.v;} }p[MAXN*MAXN]; int x[MAXN], y[MAXN], f[MAXN], n,m; int find(int x){return f[x] == x ? x : f[x] = find(f[x]);} double kruskal() { for(int i = 0; i <= n; i++)f[i] = i; double ans = 0; int cnt = 1; sort(p,p+m); for(int i = 0; i < m; i++) { int a = find(p[i].a), b = find(p[i].b); if(a != b) ans += p[i].v, f[a] = b, cnt++; if(cnt == n) break; } if(cnt < n) return -1; return ans; } int main() { #ifdef SHY freopen("e:\\1.txt","r",stdin); #endif int t; scanf("%d%*c", &t); while(t--) { m = 0; scanf("%d%*c", &n); for(int i = 0; i < n; i++) scanf("%d %d%*c", &x[i], &y[i]); for(int i = 0; i < n; i++) { for(int j = i+1; j < n; j++) { p[m].v= dis(i,j); if(10.0 <= p[m].v && 1000.0 >= p[m].v) p[m].a = i, p[m++].b = j; } } double ans = kruskal(); if(ans > 0.0) printf("%.1lf\n", ans*100.0); else puts("oh!"); } return 0; }
【prim算法 O(n^2)】
【codevs 1003】
#define rep(i,a,n) for(int i = a; i < n; i++) #define repe(i,a,n) for(int i = a; i <= n; i++) #define per(i,n,a) for(int i = n; i >= a; i--) #define clc(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long LL; #define MAXN 110 int cost[MAXN][MAXN], n, low[MAXN], u[MAXN], v[MAXN], f[MAXN],len; bool vis[MAXN]; /*f[]记录路径(父亲节点),*/ int prim() { int ans = 0; len = 0; clc(vis,0); vis[1] = true;//从1开始查找 repe(i,2,n) low[i] = cost[1][i], f[i] = 1; repe(i,2,n) { int mi = INF, p = -1; repe(j,1,n)//找到没有选择点的最小的距离 { if(!vis[j] && mi > low[j]) { mi = low[j]; p = j; } } if(INF == mi) return -1;//原图不连通 ans += mi; if(mi)//本题要求路径u<v,且0花费路径不需要记录(因为本题0是已经存在的路) u[len] = min(p,f[p]), v[len++] = max(p,f[p]); vis[p] = true; repe(j,1,n) { if(!vis[j] && low[j] > cost[p][j])//更新距离和f[] low[j] = cost[p][j], f[j] = p; } } return ans; }
相关文章推荐
- POJ-1251 Jungle Roads 最小生成树 两种算法的简单模板
- 图 之 MST(最小生成树 — kruskal算法 )并查集实现
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解
- POJ 1861 Network [最小生成树算法MST-kruskal 数据结构-并查集 union-find sets]
- 由最小生成树(MST)到并查集(UF)
- 最小生成树Kruskal算法【模板】 与 并查集 例题:简单 poj 2485 Highways
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
- 最小生成树(MST)[简述][模板]
- 由最小生成树(MST)到并查集(UF)
- 拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
- 最小生成树模板 并查集
- 最小生成树+并查集模板
- 最小生成树MST的Kruskal算法+并查集(链表实现)划分连通分量和集合,并查集可以保存多个集合
- hdu 1863 畅通工程 最小生成树模板入门题 prim+kruskal两种算法AC。
- 最小生成树(MST)[简述][模板]
- 最小生成树(MST)模板
- 最小生成树(MST)模板---Kruskal算法
- ACM HDU 1162 Eddy's picture (简单最小生成树,开始练习使用模板了)
- 最小生成树裸题(模板题)(学习题)——PKU1258
- Kurskal算法生成最小生成树MST