算法导论学习-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算法,我们主要关注的是增量的变化,也就是从每个非树顶点到树顶点的最短距离,使得最后生成一棵包括所有顶点的树,并且这棵树的 ...
随机推荐
- Unity3d Shader开发(一)Properties
着色器可以定义一个参数列表,可以由开发者在材质检视面板编辑参数.着色器文件中的Properties块定义了这些参数: 语法: Properties { Property [Property ...] ...
- Python Geospatial Development reading note(1)
chapter 1, Summary: In this chapter, we briefly introduced the Python programming language and the m ...
- windows store app 拷贝文件到pc目录
(function () { "use strict"; WinJS.Binding.optimizeBindingReferences = true; var app = Win ...
- 常用javascript代码片段集锦
常用方法的封装 根据类名获取DOM元素 var $$ = function (className, element) { if (document.getElementsByClassName) { ...
- Nhibernate 一对多,多对一配置
先来分析下问题,这里有两张表:Users(用户表) U和PersonalDynamic(用户动态表) PD,其中PD表的UserId对应U表的Id 如图: 现在映射这两张表: 如图: User.hbm ...
- Linux fdisk 命令
Linux fdisk 命令 fdisk fdisk功能说明:磁盘分区.语 法:fdisk [-b <分区大小>][-uv][外围设备代号] ...
- List<>过滤重复的简单方法
List<int> ss = new List<int>(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add(); ss.Add ...
- Ubuntu下使用ap-hotspot出现“Another process is already running"问题的解决方案
参考Problem with ap-hotspot 问题描述: This is the message displayed in my terminal screen when I typed sud ...
- 一位IT行业高收入者的理财规划方案
一位IT行业高收入者的理财规划方案 http://zhuanlan.zhihu.com/invest/19670220 Alex · 12 天前 回望2013,这一年是极其不寻常的.理财浪潮席卷大江南 ...
- 产品不应该大而全,而是应该小而精(DropBox有感,产品要1分钟学会)
昨天试用了一下DROPBOX的个人版,对它的功能与界面简单深感震惊. 后来与一位业内朋友交流了一下,他说: 产品一般都是通过一个点来做.把一个点做到最好有可能会成为平台.另外还要在合适的时间做合适的事 ...