Prim和Kruskal最小生成树
标题: Prim和Kruskal最小生成树
时 限: 2000 ms
内存限制: 15000 K
总时限: 3000 ms
描述: 给出一个矩阵,要求以矩阵方式单步输出生成过程。
要求先输出Prim生成过程,再输出Kruskal,每个矩阵输出后换行。
注意,题中矩阵表示无向图
输入: 结点数
矩阵
输出: Prim:
矩阵输出
Kruskal:
矩阵输出
输入样例:
3
0 1 3
1 0 2
3 2 0
输出样例:
3
0 1 3
1 0 2
3 2 0
Prim:
0 0 0
0 0 0
0 0 0
0 1 0
1 0 0
0 0 0
0 1 0
1 0 2
0 2 0
Kruskal:
0 0 0
0 0 0
0 0 0
0 1 0
1 0 0
0 0 0
0 1 0
1 0 2
0 2 0
提示: Kruskal 中的边集合应用拓扑排序的想法排除环
来源: 教材P170-179
//2016.10.25
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 200 using namespace std; struct Edge
{
int u, v, c;
bool operator<(Edge x){
return c < x.c;
}
}edge[];
int G[N][N], T[N][N], n, cnt, fa[N]; void print(int T[][N])
{
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++){
printf("%d ", T[i][j]);
}
printf("\n");
}
printf("\n");
} void init(int n)
{
for(int i = ; i <= n; i++)
fa[i] = i;
} int getfa(int x)
{
if(fa[x] == x) return x;
return fa[x] = getfa(fa[x]);
} void myUnion(int a, int b)
{
int af = getfa(a);
int bf = getfa(b);
if(af != bf)fa[bf] = af;
} void prim()
{
int book[N], uf, vf;
memset(T, , sizeof(T));
memset(book, , sizeof(book));
print(T);
sort(edge, edge+cnt);
init(n);
int cntv = ;
int parent = edge[].u;
while(cntv < n)
{
for(int i = ; i < cnt; i++)
{
if(book[i])continue;
uf = getfa(edge[i].u);
vf = getfa(edge[i].v);
if((uf == parent || vf == parent) && uf != vf)
{
myUnion(parent, uf);
myUnion(parent, vf);
book[i] = ;
T[edge[i].u][edge[i].v] = T[edge[i].v][edge[i].u] = edge[i].c;
print(T);
cntv++;
break;
}
}
}
return ;
} void kruskal()
{
sort(edge, edge+cnt);
int book[N], uf, vf;
init(n);
memset(book, , sizeof(book));
memset(T, , sizeof(T));
print(T);
for(int i = ; i < cnt; i++)
{
uf = getfa(edge[i].u);
vf = getfa(edge[i].v);
if(uf != vf)
{
T[edge[i].u][edge[i].v] = T[edge[i].v][edge[i].u] = edge[i].c;
myUnion(edge[i].u, edge[i].v);
book[edge[i].u] = book[edge[i].v] = ;
print(T);
}
int sum = ;
for(int i = ; i <= n; i++){
if(fa[i] == i)sum++;
if(sum > )break;
}
if(sum==)break;
}
return;
} int main()
{
cnt = ;
scanf("%d", &n);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
{
scanf("%d", &G[i][j]);
if(i < j && G[i][j] != )
{
edge[cnt].u = i;
edge[cnt].v = j;
edge[cnt].c = G[i][j];
cnt++;
}
}
printf("Prim:\n");
prim();
printf("Kruskal:\n");
kruskal(); return ;
}
Prim和Kruskal最小生成树的更多相关文章
- Kruskal和Prim算法求最小生成树
Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...
- [数据结构]最小生成树算法Prim和Kruskal算法
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
- 图的最小生成树的理解和实现:Prim和Kruskal算法
最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边.我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning ...
- 最小生成树(Prim算法+Kruskal算法)
什么是最小生成树(MST)? 给定一个带权的无向连通图,选取一棵生成树(原图的极小连通子图),使生成树上所有边上权的总和为最小,称为该图的最小生成树. 求解最小生成树的算法一般有这两种:Prim算法和 ...
- 最小生成树(prim和kruskal)
最小生成树(prim和kruskal) 最小生成树的最优子结构性质 设一个最小生成树是T.如果选出一个T中的一条边,分裂成的两个树T1,T2依然是它们的点集组成的最小生成树.这可以用反证法来证.反着来 ...
- 数据结构(三十三)最小生成树(Prim、Kruskal)
一.最小生成树的定义 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边. 在一个网的所有生成树中,权值总和最小的生成树称为最小代价生成树(Minimum ...
- 最小生成树,Prim和Kruskal的原理与实现
文章首先于微信公众号:小K算法,关注第一时间获取更新信息 1 新农村建设 大清都亡了,我们村还没有通网.为了响应国家的新农村建设的号召,村里也开始了网络工程的建设. 穷乡僻壤,人烟稀少,如何布局网线, ...
- 最小生成树MST算法(Prim、Kruskal)
最小生成树MST(Minimum Spanning Tree) (1)概念 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,所谓一个 ...
- 【图论】信手拈来的Prim,Kruskal和Dijkstra
关于三个简单的图论算法 prim,dijkstra和kruskal三个图论的算法,初学者容易将他们搞混,所以放在一起了. prim和kruskal是最小生成树(MST)的算法,dijkstra是单源最 ...
随机推荐
- Freemodbus 1.5
源:http://blog.sina.com.cn/s/blog_4935209001012eax.html 网站位置:http://www.freemodbus.org/index.php?lang ...
- [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist 160913 02:11:21 mysqld_safe mysqld from pid file /tmp/mysql.pid ended
-- :: [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0 -- :: [Warning] InnoDB: New ...
- hibernate---一对一双向外键关联 (重要)
husband--wife: one to one 双向外键关联: 主导方: @OneToOne @JoinColumn(name="wifeId") 被主导方: @OneToOn ...
- DIV+CSS 常见问题及解决办法整理
http://blog.shaogroup.com/divcss-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%8F%8A%E8%A7%A3%E5%86%B3%E5% ...
- apache、nginx、iis 全球分布
从下图(2012年8月份的数据)来看,来自俄罗斯的Nginx服务器,主要使用区域也集中在俄罗斯及周边国家.微软的IIS,在中国使用最多,占其总份额的57.6%,其他国家如埃及.沙特阿拉伯等国家也基本使 ...
- mustache.js基本使用(一)
作者:zccst 模板已是第二次接触,第一次使用模板记得是在十分系统里渲染页面时使用,当时已做到熟练使用,但实际上仍不知道原因. 再次学习模板已不是从0开始,所以还算顺手,但毕竟还只限于使用,今天继续 ...
- JAVA基础--工厂模式
interface Fruit{ // 定义一个水果接口 public void eat() ; // 吃水果 } class Apple implements Fruit{ public void ...
- MVC 5学习总结笔记1
01.使用MVC自带的DataAnnotations实现数据验证 public class ExternalLoginConfirmationViewModel { [Required] [Displ ...
- Thinking in scala (6)----高阶函数----返回一个函数
在Thinking in scala (5)----高阶函数* 里面,我们演示了如何把一个函数作为参数传递给另外一个函数. 在本文里面,我们来演示函数式编程另外一个重要的特性:返回一个函数.首先来看这 ...
- iOS开发:创建真机调试证书 分类: ios相关 2015-04-10 10:22 149人阅读 评论(0) 收藏
关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架发布问题.今天就着重说一下关于针对于苹果 ...