Kruskal算法(不能运行)
来源:互联网 发布:手机上怎么看淘宝分销 编辑:程序博客网 时间:2024/05/21 09:52
/** * *Coder: LinX 2017-7-16 * *内容: 使用Kruskal算法计算无向图的最小生成树 * *说明: 此算法复杂度只与图的边数有关,因此适合于稀疏图 */ #include <stdio.h> #include <stdlib.h> int enums; typedef struct { int start,end;//边的两个顶点 int weight;//边的权值 }Road; int Kruskal(Road road[],int v[]); int getRoot(int v[],int vt); int main() { int i,start,end,weight,v[100]; Road road[100]; printf("输入边的条数: "); scanf("%d",&enums); printf("输入边信息(输入一对顶点的位置)及权值: "); /*初始化road数组和并查集*/ for(i=0;i<enums;i++) { scanf("%d%d%d",&start,&end,&weight); road[i].start=start; road[i].end=start; road[i].weight=weight; v[i]=i;//刚开始每个节点都是一棵树 } return 0; } int Kruskal(Road road[],int v[]) { int i,a,b,sum=0; sort(road);//使road数组按照权值大小排序,这里没有写函数 //排好序之后从第一条边(权值最小)开始,取起点和终点,更新并查集(其实就是树) // 更新方法:1.如果两个顶点不再一棵树上,那么将起点的根节点作为根节点,终点的根节点作为子节点(只需将并查集数组的子节点//的值改成起点的值) 2.如果两个顶点在一棵树上,那么跳过。 //判断是否在一棵树上的方法:算出起点和终点的根节点,如果根节点相同那么就在一棵树,否则不在 for(i=0;i<enums;i++) { a=getRoot(v,road[i].start); b=getRoot(v,road[i].end); if(a!=b) { v[b]=a; sum=sum+road[i].weight; } } return sum; } int getRoot(int v[],int vt) { while(vt!=v[vt]) { vt=v[vt]; } return vt; }
阅读全文
1 0
- Kruskal算法(不能运行)
- Kruskal算法 (转载)
- poj2349 (kruskal算法)
- Kruskal算法(模板)
- 十三周 项目一 运行所讲算法,观察结果并领会算法(Kruskal)
- kruskal算法(C++实现)
- kruskal算法(C++实现)
- Kruskal算法(JAVA实现)
- Kruskal算法
- Kruskal算法
- Kruskal算法
- kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- kruskal算法
- kruskal算法
- lintcode-- 四数之和
- 湖南省第九届大学生计算机程序设计竞赛 好老师
- linux下离线安装mysql
- OpenJudge-49:计算对数
- 解决record is locked by another user
- Kruskal算法(不能运行)
- Android-auto-android-car崛起-黑莓的QNX在汽车领域的未来将如何
- 【贪心】qbxt精英班
- 浙工大姗姗杯round2 CodeForces 116BLittle Pigs and Wolves
- kermit安装及使用
- 网络基础篇(三):交换机工作原理
- Git
- HybridJAVA 与JS交互
- idea快捷键使用