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是单源最 ...
随机推荐
- php使用curl设置超时的重要性
原文:http://phpquan.com/lamp/php/php-curl-timeout/ 网站登录不了,原因是没有可用的 PHP 子进程来响应新的请求了.这可能是是由于PHP-curl 没有 ...
- 读 《我为什么放弃Go语言》 有感
最近又熟悉了下go语言,发现go语言还有许多设计不好的地方,然后又读到了<我为什么放弃Go语言>这篇文章, 对于某些方面,我还是比较认同的. 这篇文章总结了十六点,如下: 1.1 不允许左 ...
- 使用MySQL命令行新建用户并授予权限的方法
MySQL命令行能否实现新建用户呢?答案无疑是肯定的.而且在使用使用MySQL命令行新建用户后,还可以为用户授予权限. 首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的ro ...
- Struts2---声明式异常处理
在service方法里 throw抛出一个异常, 然后再方法声明上加上throws: public List<Category> list() throws SQLException{ C ...
- Android获取手机屏幕宽高
//如果是获取单位是像素,可以如下: Display display = getWindowManager().getDefaultDisplay(); Point size = new Point( ...
- MySQL show master / slave status 命令参数
一.show master status 二.show slave status Slave_IO_State SHOW PROCESSLIST输出的State字段的拷贝.SHOW PROCESSLI ...
- 手动调用NDK编译HelloWorld
首先,你得有NDK(木有的自行搜索) /home/xxxx/tools/android-ndk-r12b 准备好你的HelloWorld程序源码: #include<stdio.h> in ...
- JDBC连接数据库以及简单的操作
package com.zhiyuan.jdbc.util; import java.sql.Connection;import java.sql.DriverManager;import java. ...
- USB入门基础知识(转)
源:USB入门基础知识 相关名词: 主机(Host) 设备(Device) 接口(Interface) 管道(Pipe) 管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交 ...
- Thinking in scala (1)----类
ChecksumAccumulator.scala import scala.collection.mutable.Map class ChecksumAccumulator { private va ...