经典问题----最小生成树(prim普里姆贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈。
思路简介:对比普里姆和克鲁斯卡尔算法,克鲁斯卡尔算法主要针对边来展开,边数少时效率比较高,所以对于稀疏图有较大的优势;而普里姆算法对于稠密图,即边数非常多的情况下更好一些。其大致思路为在现有顶点中任意寻找一个顶点,将他作为根结点,然后在与他连接的所有边中,选择一条最短的边,同时将这条边两端的顶点做上标记,接着搜索所有连接做上标记的两个顶点的边,在除去已经使用过的边中寻找最短的边,如果有相同长度的不同边,则任选一条,接着搜索连接3点的边,重复以上过程。
简单代码:
#include <iostream>
#include <cmath>
#include<stdio.h>
#include <cstdio>
#include <cstring>
#include<algorithm>
#include<time.h>
using namespace std;
#define Maxn 110
#define INF 9999999
int maz[Maxn][Maxn], lowcase[Maxn], flag[Maxn];
//maz[i][j]表示i到j的距离,注意无向图和重边!lowcase数组存的是现已在树里的点所能到达的点的最小权值
//flag数组是用来标记某个点是否已经在树里面
int prim(int n)
{
int i, j, ans = , pos, min;//ans为最小生成树权重,pos为现有边的另一个顶点,mi为当前边的值
memset(flag, , sizeof(flag));//设置所有的顶点为未访问,即0
for (i = ; i <= n; ++i)
lowcase[i] = maz[][i];//先以1作为根节点,更新lowcase数组
lowcase[] = ;//为了数组里的值全
flag[] = ;//1这个点标记为已在树里面,防止绕成圈
for (i = ; i < n - ; ++i)//循环n-1次,每次找一个点纳入到树里面,加上1根节点总共就是n个点
{
min = INF;//mi为每次在lowcase数组里找到的最小值,所以刚开始赋值成最大值 ,
//inf一般是因为得到的数值,超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值);而nan一般是因为对浮点数进行了未定义的操作,如对-1开方。
for (j = ; j <= n; ++j)
{
if (!flag[j] && lowcase[j] < min)//未重复 边较小
{
min = lowcase[j];
pos = j;//记录另一端顶点
}
}
ans += min;
flag[pos] = ;//标记这一步确定好的顶点
for (j = ; j <= n; ++j)//用新的节点更新lowcase数组
{
if (!flag[j] && maz[pos][j] < lowcase[j])
{
lowcase[j] = maz[pos][j];
}
}
}
return ans;
}
int main()
{
int n, i, j;
while (~scanf("%d", &n) && n)//输入有几个顶点
{
for (i = ; i <= n; ++i)//构建无向邻接矩阵
{
for (j = ; j <= n; ++j)
maz[i][j] = i == j ? : INF;
}//刚开始得把数组里的数存成无穷大 ,那样后期就只需改存在边的数值
int a, b, c;//a,b为边起始,结束点,c为边长度
for (i = ; i < n*(n - ) / ; ++i)
{
scanf("%d%d%d", &a, &b, &c);
if (c < maz[a][b])//确保输入边有效
maz[a][b] = maz[b][a] = c;//无向图+重边
}
int ans = prim(n);
printf("%d\n", ans);
}
return ;
}
经典问题----最小生成树(prim普里姆贪心算法)的更多相关文章
- POJ 1751 Highways(最小生成树Prim普里姆,输出边)
题目链接:点击打开链接 Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has ...
- ACM第四站————最小生成树(普里姆算法)
对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
还是畅通工程 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- JS实现最小生成树之普里姆(Prim)算法
最小生成树: 我们把构造连通网的最小代价生成树称为最小生成树.经典的算法有两种,普利姆算法和克鲁斯卡尔算法. 普里姆算法打印最小生成树: 先选择一个点,把该顶点的边加入数组,再按照权值最小的原则选边, ...
- 最小生成树之Prim(普里姆)算法
关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- 查找最小生成树:普里姆算法算法(Prim)算法
一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...
- 经典问题----最小生成树(kruskal克鲁斯卡尔贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
- (原创)最小生成树之Prim(普里姆)算法+代码详解,最懂你的讲解
Prim算法 (哈欠)在创建最小生成树之前,让我们回忆一下什么是最小生成树.最小生成树即在一个待权值的图(即网结构)中用一个七拐八绕的折线串连起所有的点,最小嘛,顾名思义,要权值相加起来最小,你当然可 ...
随机推荐
- js 两数的最大公约数
function gcd(a,b){ if (b == 0){ return a; } var r = parseInt(a % b) ; return gcd(b, r);}gcd(12,5);
- spring cloud 随笔记录(1)-
最近随着微服务的火热,我也开始对我服务进行了解了 毕竟程序员这一行需要及时更新自己的技能,才能更好的生存. 我理解的微服务 项目由多个独立运行的程序组成,每个服务运行在自己的进程中,服务间采用轻量 ...
- 在当前TestSuite/TestCase run之前先run另一个TestSuite/TestCase
在当前的TestSuite/TestCase的Setup Script里面写上这段代码: import com.eviware.soapui.model.support.PropertiesMap l ...
- 初学者--oracle安装完后出现的一些问题
对于初学者安装数据库后,立马回运行数据库,看是否安装成功,但oracle安装完成,其中有些都是默认状态,所以需要手动修改和添加.例如这个问题 1.pl/sql developer was not te ...
- GitHub入门与实践 读书笔记三:(1)GitHub账户注册教程
第一步:进入GitHub官网,官网地址:https://github.com/ 第二步:点击Sign up for GitHub 1.昵称一栏:每次在你输入昵称之后,都会检查是否已经被注册.如果被注册 ...
- linux centos7下源码 tar安装mysql5.7.23(5.7以上均可试用)
1.工具:mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz.centos7 2.解压后,将mysql-5.7.22-linux-glibc2.12-x86_64里面 ...
- 将一个float型转化为内存存储格式的步骤
将一个float型转化为内存存储格式的步骤为: (1)先将这个实数的绝对值化为二进制格式. (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边. (3)从小数点右边 ...
- html之跳转锚
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 百度翻译新API C#版在 winform,Asp.Net的小程序
3月的下午,在C#群里日常装逼(聊天), 一兄弟说百度翻译有没有winfrom上用的Demo,问了一天 嫌烦了 我就干脆自己写个: PS 百度上的部分代码害死人啊 api地址都换的不成样了, 还 ...
- 开发H5页面遇到的问题以及解决
1.第一个问题就是规范问题,现在边注释边编程以及语义化命名的问题已经基本的改善,页面的层级结构设计也条理了许多,现在的问题就是我对于页面的更深的应用还不够,比如我知道文档流自上而下从左至右,写在下面的 ...