克鲁斯卡尔Kruskal
来源:互联网 发布:mac电脑锁屏快捷键 编辑:程序博客网 时间:2024/04/29 00:22
寻找直接或间接连通所有城市的,最小费用的道路集合的问题,就是寻找最小生成树的问题.
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define MAX 100/* 定义边(x,y),权为w */typedef struct{ int x, y; int w;}edge;edge e[MAX];/* rank[x]表示x的秩 */int rank[MAX];/* father[x]表示x的父节点 */int father[MAX];int sum; //typedef int (*cmptr)(const int a, const int b);int cmp(const void*a,const void*b){ return (*(edge*)a).w>(*(edge*)b).w?1:-1;}/*堆排序*//* 初始化集合 */void Make_Set(int x){ father[x] = x; rank[x] = 0;}/* 查找x元素所在的集合,回溯时压缩路径 */int Find_Set(int x){ if (x != father[x]) { father[x] = Find_Set(father[x]); } return father[x];}/* 合并x,y所在的集合 */void Union(int x, int y, int w){ if (x == y) return; /* 将秩较小的树连接到秩较大的树后 */ if (rank[x] > rank[y]) { father[y] = x; } else { if (rank[x] == rank[y]) { rank[y]++; } father[x] = y; } sum += w;}/* 主函数 */int main(){int i, n; int x, y; char chx, chy; for(i=1;i<=26;i++) Make_Set(i); scanf("%d", &n); getchar(); for (i = 1; i <=n; i++) { scanf("%c%c", &chx, &chy); getchar(); scanf("%d",&e[i].w); getchar(); e[i].x = chx - 'a'+1; e[i].y = chy - 'a'+1; } qsort(e,n,sizeof(e[0]),cmp); sum = 0; for (i = 1; 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'-1, e[i].y + 'a'-1, e[i].w); Union(x, y, e[i].w); } } printf("Total:%d\n", sum); return 0; }
0 0
- Kruskal(克鲁斯卡尔)
- 克鲁斯卡尔Kruskal
- 克鲁斯卡尔(Kruskal)算法
- 克鲁斯卡尔(Kruskal)算法
- kruskal克鲁斯卡尔算法
- 克鲁斯卡尔算法(Kruskal)
- 克鲁斯卡尔算法(Kruskal)模板
- 克鲁斯卡尔(Kruskal)算法
- (Kruskal)克鲁斯卡尔算法
- kruskal's algorithm.[克鲁斯卡尔算法]
- [数据结构]克鲁斯卡尔(Kruskal)算法
- C语言-数据结构-克鲁斯卡尔kruskal
- 最小生成树---克鲁斯卡尔kruskal算法
- 克鲁斯卡尔(Kruskal)算法求最小生成树
- 最小生成树-克鲁斯卡尔-Kruskal算法
- 最小生成树---克鲁斯卡尔kruskal算法---Simple one
- 求最小生成树_克鲁斯卡尔算法(Kruskal)
- 克鲁斯卡尔(Kruskal)算法求解最小生成树
- Missing Number
- Linux文件查找命令 - find
- cite是某些文字斜体显示
- 浅谈安卓中的MVP模式
- Java笔记(五) 输入输出
- 克鲁斯卡尔Kruskal
- (学习笔记)事务的三种问题
- Shell 编程:Bash空格的那点事
- Shell编程 Bash引号的那点事
- 农村土地确权之系列文档 —— 新分户分开确权申请书
- 使用Apriori算法和FP-growth算法进行关联分析
- 关于基类与派生类之间指针转化关系小结
- Mac 修改文件权限
- 最终的决定