标题: 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. C++ string 类重写

    (我们知道学习C++时,在学习完C的基础内容后最先上手的就是C++的string类来学习字符串处理的内容,这里我们通过重写string类来重新认识字符串处理的内容) 1.树立string类主要函数,确 ...

  2. php 注意点

    1.如果一个方法可静态化,就对它做静态声明.速率可提升至4倍. 2.echo 比 print 快. 3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接. 4.在执行for循环之前确定 ...

  3. JS——无缝滚动

    1.描述——无缝滚动图片 2.代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  4. iOS之NSDictionary和NSArray以及NSMutableDictionary和NSMutableArray:将不再是问题

    字典的key就相当于数组的下标,怎样操作数组你就学会了怎样才做字典:来感受一把 需要注意的是读取文件的类型要集合.plist文件的rooty:否则将不能读入文件 // 1.全国省市:得到的是省和市 / ...

  5. compass scss blueprint

    [转载] 今天在执行compass create my-grid –using blueprint 命令时发现报错 google了一下,说是新版compass已经不包括compass-bluprint ...

  6. Cocos2dx 3.1.1 学习笔记整理(4):事件监听与Action的初步使用

    项目忙,趁着刚才有点空,看了下触摸事件在新版本中怎么实现,遇到问题都是去:cocos2d-x-3.1.1\tests\cpp-tests\Classes下面找的,里面都是一些小例子. 首先新的CCNo ...

  7. 第一次在手机上跑动ane

    记录一下: 打包的时候先出现 error 100: descriptor cannot be parsed, 原因是命名空间少了个引号,自己粗心所致 第二次打包出现了invalid namespace ...

  8. HDU 5616 Jam's balance

    背包.dp[i]=1表示i这种差值能被组合出来,差值有负数,所以用sum表示0,0表示-sum,2*sum表示sum. 询问X的时候,只需看dp[sum+X]或者dp[sum-X]是否有一个为1,注意 ...

  9. AWK用法入门详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  10. iOS10适配——错误:Code=3000

    error : Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserIn ...