Kruscal算法
Kruscal算法也是最小生成树算法,这个算法感觉起来可能更直观一点,我们要求最小生成树,我们可以依次找图中的最小权重所在的边,只要这些边不构成回路就添加,知道覆盖所有的顶点。
算法的具体过程:
1、将权重排序,要对权重排序,在邻接矩阵中权重处理不是很方便,构建边的结构
typedef struct
{
int begin;
int end;
int weight;
}Edge;
2、避免环的时候的处理手法,也就是通过一个点找到其下一个点,再根据这个点找下面一个点,依次。。。
int findParent(int *parent,int f)
{
while(parent[f]>0)
{
f=parent[f];
}
return f;
}
这样就可以根据一个边的起点找到一个点,根据边的结束点找到另外一个连接点,如果找到这两个点不一致,则说明不是环。
具体的怎个代码如下:
#include <stdio.h> #define MAXVEX 20
#define INFINITY 65535 typedef struct
{
int arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
}MGraph; typedef struct
{
int begin;
int end;
int weight;
}Edge; void createMGraph(MGraph *g);
void sort(Edge edges[],MGraph *g);
void swapn(Edge *edges,int i,int j);
int findParent(int *parent,int f);
void minSpanTreeKruskal(MGraph g); void createMGraph(MGraph *g)
{
int i, j; g->numEdges=15;
g->numVertexes=9; for (i = 0; i < g->numVertexes; i++)
{
for ( j = 0; j < g->numVertexes; j++)
{
if (i==j)
g->arc[i][j]=0;
else
g->arc[i][j] = g->arc[j][i] = INFINITY;
}
} g->arc[0][1]=10;
g->arc[0][5]=11;
g->arc[1][2]=18;
g->arc[1][8]=12;
g->arc[1][6]=16;
g->arc[2][8]=8;
g->arc[2][3]=22;
g->arc[3][8]=21;
g->arc[3][6]=24;
g->arc[3][7]=16;
g->arc[3][4]=20;
g->arc[4][7]=7;
g->arc[4][5]=26;
g->arc[5][6]=17;
g->arc[6][7]=19; for(i = 0; i < g->numVertexes; i++)
{
for(j = i; j < g->numVertexes; j++)
{
g->arc[j][i] =g->arc[i][j];
}
}
} void sort(Edge edges[],MGraph *g)
{
int i,j;
for(i=0;i<g->numEdges;i++)
{
for(j=i+1;j<g->numEdges;j++)
{
if(edges[i].weight>edges[j].weight)
{
swapn(edges,i,j);
}
}
}
} void swapn(Edge *edges,int i,int j)
{
int temp;
temp = edges[i].begin;
edges[i].begin = edges[j].begin;
edges[j].begin = temp; temp = edges[i].end;
edges[i].end = edges[j].end;
edges[j].end = temp; temp = edges[i].weight;
edges[i].weight = edges[j].weight;
edges[j].weight = temp;
} void minSpanTreeKruskal(MGraph g)
{
int i,j,n,m;
int k =0;
int parent[MAXVEX]; Edge edges[MAXVEX]; for(i = 0;i<g.numVertexes-1;i++)
{
for(j=i+1;j<g.numVertexes;j++)
{
if(g.arc[i][j]<INFINITY)
{
edges[k].begin = i;
edges[k].end = j;
edges[k].weight = g.arc[i][j];
k++;
}
}
}
sort(edges,&g); for(i=0;i<g.numVertexes;i++)
{
parent[i] = 0;
} printf("打印:\n");
for(i = 0; i<g.numEdges; i++)
{
n= findParent(parent,edges[i].begin);
m= findParent(parent,edges[i].end);
if(n!=m)
{
parent[n] = m;
printf("(%d,%d) %d\n",edges[i].begin,edges[i].end,edges[i].weight);
}
}
} int findParent(int *parent,int f)
{
while(parent[f]>0)
{
f=parent[f];
}
return f;
} int main()
{
MGraph g;
createMGraph(&g);
minSpanTreeKruskal(g);
return 0;
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Kruscal算法的更多相关文章
- hiho 1098 最小生成树二·Kruscal算法 (最小生成树)
题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析, ...
- 最小生成树(kruscal算法)
其实kruscal算法很简单,把边从小到大排一遍,如果加入此边形成环,就不加,知道这棵树有n-1条边. 代码如下(一定要理解): #include<iostream> #include&l ...
- hihocoder#1098 : 最小生成树二·Kruscal算法
#1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...
- Kruscal算法求图的最小生成树
Kruscal算法求图的最小生成树 概述 和Prim算法求图的最小生成树一样,Kruscal算法求最小生成树也用到了贪心的思想,只不过前者是贪心地选择点,后者是贪心地选择边.而且在算法的实现中,我 ...
- 最小生成树二·Kruscal算法
描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成 ...
- 畅通project再续 HDU杭电1875 【Kruscal算法 || Prim】
Problem Description 相信大家都听说一个"百岛湖"的地方吧.百岛湖的居民生活在不同的小岛中.当他们想去其它的小岛时都要通过划小船来实现.如今政府决定大力发展百岛湖 ...
- HDU 1102 Kruscal算法
题目大意:给定村庄的数量,和一个矩阵表示每个村庄到对应村庄的距离,矩阵主对角线上均为1 在给定一个数目Q,输入Q行之间已经有通道的a,b 计算还要至少修建多少长度的轨道 这道题目用Kruscal方法进 ...
- 【Matrix-tree定理】【并查集】【kruscal算法】bzoj1016 [JSOI2008]最小生成树计数
题意:求一个图的最小生成树个数. 矩阵树定理:一张无向图的生成树个数 = (度数矩阵 - 邻接矩阵)的任意一个n-1主子式的值. 度数矩阵除了对角线上D[i][i]为i的度数(不计自环)外,其他位置是 ...
- hdu1162(最小生成树 prim or kruscal)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 意义:给出一些点,用线问使所有点直接或间接连通,需要多长: 思路:裸最小生成树: 法1: pri ...
随机推荐
- 笔记本 windows 10 安装
开机按快捷键是F12,选择从usb启动.秋叶系统 很好用,推荐使用. 联想笔记本u深度一键u盘启动BIOS设置教程:准备工作:制作好u深度u盘启动盘http://rj.baidu.com/soft/d ...
- C#常见问题总结(三)
11.sql比access好在哪里,为什么都用sql 解决方法: 数据量大,可以在服务器端,access一般在单机的时候用 12.c#基础视频教程有吗 解决方法: 零基础学C#这本书带全套C#基础视频 ...
- oracle in表达式参数支持最大上限1000个
oracle in表达式参数支持最大上限1000个 方法是拆分为多个 col in ... or col in ... #region 解决大于1000的问题 private String getSu ...
- 个人软件过程(psp)需求分析
个人软件过程(psp)需求分析 1. 引言 1.1 背景 开发项目进度计划不准确,延期经常出现,甚至无法给出一个比较准确的延迟时间,给市场推广带来很大麻烦. 2. 任务概述 2.1 目标 PSP ...
- SQLState: 23000
今天登陆项目的时候,报500,日志显示如下: 解决办法是: 首先,删除序列:DROP SEQUENCE sys_log_seq 然后,新建序列:CREATE SEQUENCE sys_log_seq ...
- SpringMVC接收多参数的处理方法
问题:依赖SpringMVC自带的机制解析多对象参数往往出现解析不了的问题,使用较为复杂. 解决思路:前端 JS 先把传递到后台的对象转换为 JSON 字符串,后台直接使用字符串类型接收,再使用 st ...
- layer iframe层ajax回调弹出layer.msg()
ajax success方法 success: function(data){ layer.msg("输入你需要的提示",{time:1000,end:function(){ // ...
- 比较synchronized和读写锁
一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用, ...
- 我的第一次"闭包"应用
结论: 闭包可以当作强类型语言如C++.Java的全局变量使用,非常巧妙 需求: ssm项目,使用pagehelper分页,在写前一页.后一页.第一页.最后一页等页面跳转时,遇到了问题,如果查询全部的 ...
- 洛谷——P2261 [CQOI2007]余数求和
P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...