[算法] kruskal最小生成树算法
#include <stdio.h>
#include <stdlib.h> #define MAX 100 int N, M; struct Edge {
int u,v;
int weight;
} edge[MAX]; int vertexs[MAX];
int parents[MAX]; int edge_cmp(const void* a, const void* b) {
return ((struct Edge*)a)->weight - ((struct Edge*)b)->weight;
} int parents_find(int x) {
int s;
for(s = x; parents[s] >= 0; s = parents[s]){
;
}
return s;
} void parents_union(int r1, int r2) {
int s1, s2;
int tmp;
s1 = parents_find(r1);
s2 = parents_find(r2);
tmp = parents[s1] + parents[s2];
if(parents[s1] < parents[s2]) {
parents[s2] = s1;
parents[s1] = tmp;
}
else {
parents[s1] = s2;
parents[s2] = tmp;
}
} void kruskal() {
int sum_weight = 0;
int num = 0;
int i, u, v;
for(i = 0; i < M; i++) {
u = edge[i].u;
v = edge[i].v;
if(parents_find(u) != parents_find(v)) {
printf("%d %d %d\n", u + 1, v + 1, edge[i].weight);
num ++;
sum_weight += edge[i].weight;
parents_union(parents_find(u), parents_find(v));
}
if(num == N -1) {
break;
}
}
printf("weight of MST is %d\n", sum_weight);
} int main() {
int i;
int u, v, w; while(1) {
scanf("%d%d", &N, &M);
if(N == 0 && M == 0) {
break;
}
/* init */
for(i = 0; i < N; i++) {
vertexs[i] = i;
parents[i] = -1;
} for(i = 0; i < M; i++) {
scanf("%d%d%d", &u, &v, &w);
u --;
v --;
edge[i].u = u;
edge[i].v = v;
edge[i].weight = w;
} /* sort */
qsort(edge, M, sizeof(edge[0]), edge_cmp);
kruskal();
} return 0;
}
加边,并查集
[算法] kruskal最小生成树算法的更多相关文章
- Kruskal 最小生成树算法
对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为 ...
- [算法系列之二十七]Kruskal最小生成树算法
简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...
- 并查集和kruskal最小生成树算法
并查集 先定义 int f[10100];//定义祖先 之后初始化 for(int i=1;i<=n;++i) f[i]=i; //初始化 下面为并查集操作 int find(int x)//i ...
- 贪心算法(2)-Kruskal最小生成树
什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n ...
- Kruskal算法:最小生成树
//Kruskal算法按照边的权值从小到大查看一遍,如果不产生圈(重边等也算在内),就把当前这条表加入到生成树中. //如果判断是否产生圈.假设现在要把连接顶点u和顶点v的边e加入生成树中.如果加入之 ...
- Prim算法和Kruskal算法(图论中的最小生成树算法)
最小生成树在一个图中可以有多个,但是如果一个图中边的权值互不相同的话,那么最小生成树只可能存在一个,用反证法很容易就证明出来了. 当然最小生成树也是一个图中包含所有节点的权值和最低的子图. 在一个图中 ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 最小生成树算法(Prim,Kruskal)
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
随机推荐
- asp之vbscript函数
'函数Abs(number)'返回绝对值.Array(arglist)'创建一个数组.Asc(string)'返回字符串第一个字符的ANSI码.Atn(number)'返回反正弦值.CBool(exp ...
- 【floyd 多源最短路】 poj 1125
#include <stdio.h> #include <iostream> #include <memory.h> using namespace std; ][ ...
- TexturePacker license Key免费获取方式
TexturePacker是一款功能非常强大的图片制作工具.是一款付费软件,但是TexturePacker的作者Andreas Löw先生也给出获得免费key 的方法...大家可以到这个网站去申请 h ...
- springmvc+mybatis下载项目自带模板
1.首先如果要获取javaweb项目中的文件在哪,用到的代码:request.getSession().getServletContext().getRealPath("/WEB-INF/d ...
- java synchronized 线程同步机制详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...
- easyui-combobox select 设置不分行(只显示在一行)
使用easyui 1.4.4 <select id="hotalid" class="easyui-combobox" data-options=&quo ...
- 最短路径算法——Dijkstra算法
在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...
- mapreduce 依赖组合
mport java.io.IOException;import java.util.StringTokenizer; import org.apache.hadoop.conf.Configurat ...
- 使用RPM包安装、配置和拆卸MySQL
通过rpm包安装.配置及卸载mysql的详细过程. 以MySQL-server-4.0.14-0.i386.rpm为例,放在/usr/src目录下 cd /usr/src rpm -ivh MySQL ...
- 基于IDL 的WebRS系统设计图
图1 用例图 图2 结构图