标题: 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最小生成树的更多相关文章

  1. 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 思路:在保证不产生回 ...

  2. [数据结构]最小生成树算法Prim和Kruskal算法

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

  3. 图的最小生成树的理解和实现:Prim和Kruskal算法

    最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边.我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning ...

  4. 最小生成树(Prim算法+Kruskal算法)

    什么是最小生成树(MST)? 给定一个带权的无向连通图,选取一棵生成树(原图的极小连通子图),使生成树上所有边上权的总和为最小,称为该图的最小生成树. 求解最小生成树的算法一般有这两种:Prim算法和 ...

  5. 最小生成树(prim和kruskal)

    最小生成树(prim和kruskal) 最小生成树的最优子结构性质 设一个最小生成树是T.如果选出一个T中的一条边,分裂成的两个树T1,T2依然是它们的点集组成的最小生成树.这可以用反证法来证.反着来 ...

  6. 数据结构(三十三)最小生成树(Prim、Kruskal)

    一.最小生成树的定义 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边. 在一个网的所有生成树中,权值总和最小的生成树称为最小代价生成树(Minimum ...

  7. 最小生成树,Prim和Kruskal的原理与实现

    文章首先于微信公众号:小K算法,关注第一时间获取更新信息 1 新农村建设 大清都亡了,我们村还没有通网.为了响应国家的新农村建设的号召,村里也开始了网络工程的建设. 穷乡僻壤,人烟稀少,如何布局网线, ...

  8. 最小生成树MST算法(Prim、Kruskal)

    最小生成树MST(Minimum Spanning Tree) (1)概念 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,所谓一个 ...

  9. 【图论】信手拈来的Prim,Kruskal和Dijkstra

    关于三个简单的图论算法 prim,dijkstra和kruskal三个图论的算法,初学者容易将他们搞混,所以放在一起了. prim和kruskal是最小生成树(MST)的算法,dijkstra是单源最 ...

随机推荐

  1. __bridge,__bridge_transfer和__bridge_retained的使用和区别【转载】

    __bridge,__bridge_transfer和__bridge_retained的使用和区别[转载] Core Foundation 框架Core Foundation框架 (CoreFoun ...

  2. angularJS 系列(二)——理解指令 understanding directives

    参考:https://github.com/angular/angular.js/wiki/Understanding-Directives Injecting, Compiling, and Lin ...

  3. Java语言的学习

    众所周知,Java是上个世纪的语言产物,到现在已经有多个分支,Java和OC.Swift一样都是面向对象的语言,目前学习Java是想接触一下后台的开发,当然iOS也不会丢掉,毕竟多学一点不是坏事. 今 ...

  4. iOS开发——获取手机当前WiFi名和MAC地址

    获取手机WiFi信息. iOS9以前的方法,还是能用,警告就警告吧!iOS9以后使用的是苹果最新的API框架,NetworkExtension/NEHotspotHelper.h,这个框架,第一次开放 ...

  5. Android获取手机屏幕宽高

    //如果是获取单位是像素,可以如下: Display display = getWindowManager().getDefaultDisplay(); Point size = new Point( ...

  6. NSURL 子串截取

    NSURL *url = [NSURL URLWithString:@"http://reg.email.163.com/unireg/call.do?cmd=register.entran ...

  7. Delphi调用Android的.so文件(转)

    原地址:http://zhidao.baidu.com/link?url=fzqefMM44ljXA5BnAbkX44SapCUteyzlXFvGLKvukBivm9AB-w39P_h7eX1ty-G ...

  8. 2017-01-11小程序form表单提交

    小程序form表单提交 1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局.事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但 ...

  9. Windows显示不了磁盘

    ps:当我的磁盘插电脑上却显示不了磁盘信息.终于最后将我的200G资料,搞没了,也不能恢复了..刚刚磁盘显示了,为了让更多人能不走弯路,我结合了网络能让磁盘显示的几个经验,也便大家方便参考...   ...

  10. 使用django-compressor压缩静态文件

    Reference:http://blog.csdn.net/permike/article/details/52355095 在网站开发阶段,对于静态资源文件比如JS,CSS等文件都是未经过压缩合并 ...