最小生成树Kruskal算法朴素版 C语言实现
2017-12-11 22:15
716 查看
最小生成树Kruskal算法朴素版 C语言实现
标签:最小生成树
Prim算法参考博客
并查集基础及练习
#include <stdio.h> #include <algorithm> using namespace std; #define maxn 20 typedef struct{ int x, y; int w; }edge; edge e[maxn]; int rank_[maxn], father[maxn], sum; int cmp(edge a, edge b){ //按权值非降序排序(相同则按x坐标) if(a.w == b.w) return a.x < b.x; return a.w < b.w; } void make_set(int x){ father[x] = x; rank_[x] = 0; } int find_set(int x){ return x != father[x] ? find_set(father[x]) : father[x]; } void union_set(int x, int y, int w){ sum += w; if(x == y) return ; if(rank_[x] > rank_[y]) father[y] = x; else{ if(rank_[x] == rank_[y]) rank_[y]++; father[x] = y; } } int main(){ int n, x, y, i; char cx, cy; freopen("kruskal.txt", "r", stdin); scanf("%d", &n); getchar(); for(i = 0; i < n; i++){ scanf("%c%c %d", &cx, &cy, &e[i].w); getchar(); e[i].x = cx -'A', e[i].y = cy - 'A'; make_set(i); //0对应于A } sort(e, e + n, cmp); //for(i = 0; i < n; i++) printf("%c-%c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w); //printf("\n"); sum = 0; for(i = 0; i < n; i++){ x = find_set(e[i].x), y = find_set(e[i].y); if(x != y){ printf("%c-%c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w); union_set(x, y, e[i].w); } } printf("total: %d\n", sum); return 0; }
数据文件:
实验结果:
相关文章推荐
- 最小生成树Prim算法朴素版 C语言实现
- 最小生成树kruskal算法并查集版 C语言实现
- 最小生成树问题中Kruskal算法和Prim算法的C语言实现
- 最小生成树kruskal算法并查集版 C语言实现
- 最小生成树Prim算法朴素版 C语言实现
- 【算法和数据结构】图(三)最小生成树之Kruskal算法(C++实现)
- 最小生成树,Prim,Kruskal算法主要思想,证明及C++实现
- c语言实现最小生成树的普里姆算法(《数据结构》算法7.9)
- poj1251 Jungle Roads 最小生成树kruskal算法实现
- Java实现最小生成树Kruskal算法
- 图的最小生成树:Kruskal算法实现
- 贪心法——C语言实现最小代价生成树
- Kruskal算法求解最小生成树(c++实现)
- 图论算法:最小生成树——Prim算法和Kruskal算法C++实现
- Kruskal算法求解最小生成树的Java实现
- 实现Kruskal算法,求图的最小生成树。
- 图 之 MST(最小生成树 — kruskal算法 )并查集实现
- 最小生成树 kruskal算法 C++实现
- 十二、图的算法入门--(3)最小生成树---Kruskal算法实现
- 最小生成树-Kruskal算法 java代码实现