算法导论学习-prim算法
一. 关于最小生成树
对于无向连通图G=(V,E),其中V表示图的顶点,E表示图的边,对于每条边都有一个权值,可以理解为边a->b的权值C为从a走到b要走的路程为C。现在我们希望找到一个无回路的子集T,且有T是E的子集,T连接了所有的顶点,且其权值和最小。那么这样一个子图G‘=(V,T)称之为图G的最小生成树。
二. 最小生成树的基本性质
最小生成树的边数|T|必然服从|T|=|V|-1.
最小生成树不可以有循环
最小生成树不必是唯一的。
三. Prim算法
对于最小生成树有两种算法:prim算法和kruskal算法,这里只说prim算法。prim算法的核心是两个动态集合U和V-U。这里为了说明的更为生动一些,我用军事入侵的方式来说明prim算法的操作过程。假设有一个我方军事基地,假设该军事基地编号为1(根据不同情况可以改变),其他n-1个军事基地是敌方军事武装所在地。又假设我方军事力量空前强大,逮谁灭谁(意淫一下),但就算这样,我们也不想耗费不必要的力量(这里可以理解为不想走多余的路),我方军队想要设计一套行军路线,是的总的行军路线里程最小并且消灭完所有的地方军事武装。下面以图为例说明prim算法的执行步骤:

如上图所示有6个军事基地,除了第一个被我方占据外,其余都是敌方势力。根据prim算法,我们首先找到距离1号军事基地最近的军事基地3进行军事打击(1-3距离为1,,1-2距离为6,1-4距离为5)。在占领3号基地以后,我们继续找距离红色标注基地最近的基地,可以发现6号基地距离{1,3}为4,为最近基地。所以我方将6号基地作为下一打击对象。占领6号以后,发现4号基地距离{1,3,6}为2,为最近基地,所以4号基地为下一占领基地。相似的,e,f图依次类推。
下面附上完整代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int max_size=;
const int inf=<<;
int map[max_size][max_size];
struct edge{
int c,flag;
}edge[max_size*max_size/];
int n,m;
int prim(){
int s=,sum=;
for(int i=;i<=n;i++){
if(i==s) continue;
edge[i].c=map[s][i];
edge[i].flag=;
}
edge[s].flag=;
edge[s].c=; for(int k=;k<=n-;k++){//loop n-1 times
int mmin=inf,flag=,nearest;
for(int i=;i<=n;i++){
if(!edge[i].flag&&edge[i].c<mmin){
mmin=edge[i].c;
flag=;
nearest=i;
}
}
if(!flag) return -;
edge[nearest].flag=;
sum+=mmin;
for(int i=;i<=n;i++){
if(!edge[i].flag&&edge[i].c>map[nearest][i]){
edge[i].c=map[nearest][i];
}
}
}
return sum;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
int a,b,c;
memset(map,inf,sizeof(map));
for(int i=;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
if(prim()) printf("%d\n",prim());
else printf("fail\n");
}
}
算法导论学习-prim算法的更多相关文章
- 算法导论学习---红黑树具体解释之插入(C语言实现)
前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜 ...
- 算法起步之Prim算法
原文:算法起步之Prim算法 prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下. prim算法的安全边是从与当前生成树相连接的边中选择 ...
- 一步一步写算法(之prim算法 下)
原文:一步一步写算法(之prim算法 下) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉 ...
- 一步一步写算法(之prim算法 中)
原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...
- 一步一步写算法(之prim算法 上)
原文:一步一步写算法(之prim算法 上) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面我们讨论了图的创建.添加.删除和保存等问题.今 ...
- 数据结构与算法--最小生成树之Prim算法
数据结构与算法--最小生成树之Prim算法 加权图是一种为每条边关联一个权值或称为成本的图模型.所谓生成树,是某图的一棵含有全部n个顶点的无环连通子图,它有n - 1条边.最小生成树(MST)是加权图 ...
- 算法导论学习-Dynamic Programming
转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...
- 算法对比:Prim算法与Dijskra算法
在图论中,求MST的Prim算法和求最短路的Dijskra算法非常像.可是我一直都对这两个算法处于要懂不懂的状态,现在,就来总结一下这两个算法. 最小生成树(MST)—Prim算法: 算法步骤: •将 ...
- 【Python排序搜索基本算法】之Prim算法
Prim算法是实现最简单的最小生成树(MST)算法,适合于稠密图.要实现Prim算法,我们主要关注的是增量的变化,也就是从每个非树顶点到树顶点的最短距离,使得最后生成一棵包括所有顶点的树,并且这棵树的 ...
随机推荐
- Shell面试题
1.用Shell编程,判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下. #!/bin/bash#1.sh#判断一文件是不是字符或块设备文件,如果是将其拷贝到 /dev 目录下#f ...
- qt 5 界面美化
大家都知道,用UI做起界面来非常方便,但是如果我们不熟练他的操作的话,做起来也会有不少布局的麻烦, 所以,我打算写一篇文章来记录自己参考大牛用代码写界面的文章,感谢百度,感谢各位QT大牛的帮助. 所谓 ...
- 【单片机通信协议】CAN总线基础知识
CAN总线基础知识(一) 1.1 CAN总线是什么? CAN(Controller Area Network)是ISO国际标准化的串行通信协议.广泛应用于汽车.船舶等.具有已经被大家认可的高性能和可靠 ...
- 用JavaScript获取一个超链接的绝对URL地址
对于Web程序员来说,处理简单的URL格式也许会成为一场噩梦.试想一下,一个网址里有很多组成部分都会影响你对它的解析方法: 是否以/字符开头 是否以//开头 是否以?号开头 是否以#号开头 …等等 当 ...
- java.util.ArrayList
/* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...
- unity 基础之PhysicsManager
原地址:http://www.cnblogs.com/alongu3d/p/3644725.html @by 广州小龙 1.Gravity(重力) 物理系统都是根据实际情况进行模拟的,由于Y值是往下 ...
- UVALive 3211 Now or later
每架飞机有早晚起降两种方式,给定n架飞机两种方式的起落时间,为每架飞机安排起落时间(早或晚),使得所有飞机起降时间按照早到晚的顺序之间的间隔时间最小值尽量大. 分析: 最小时间尽量大应该采用二分的方法 ...
- 使用智遥工作流,优化SAP请购流程
传统请购流程,都是用户在SAP系统中填写请购单,然后再打印出来,递交给上级领导审批.领导审批完了,再到SAP系统中更新release标识.若中途请购单内容需要变更,则需要重新打印,审批. 智遥工作流, ...
- linux下查看防火墙当前状态,开启关闭等
从配置菜单关闭防火墙是不起作用的,索性在安装的时候就不要装防火墙 查看防火墙状态: /etc/init.d/iptables status 暂时关闭防火墙: /etc/init.d/iptables ...
- asp.net web 开发登录相关操作的控件LoginName、LoginStatus和LoginView控件使用详解
http://book.51cto.com/art/200909/154039.htm http://book.51cto.com/art/200909/154041.htm ASP.NET提供了一套 ...