博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最小生成树Kruskal算法朴素版 C语言实现
阅读量:4156 次
发布时间:2019-05-26

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

最小生成树Kruskal算法朴素版 C语言实现

标签:最小生成树

#include 
#include
using namespace std;#define maxn 20typedef 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;}

数据文件:

input
实验结果:
output

你可能感兴趣的文章
java多线程环境单例模式实现详解
查看>>
将一个数插入到有序的数列中,插入后的数列仍然有序
查看>>
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
程序员过年回家该怎么给亲戚朋友解释自己的职业?
查看>>
第六章 背包问题——01背包
查看>>
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
性能扩展问题要趁早
查看>>
MySQL-数据库、数据表结构操作(SQL)
查看>>
OpenLDAP for Windows 安装手册(2.4.26版)
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>