一. 关于最小生成树

对于无向连通图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算法的更多相关文章

  1. 算法导论学习---红黑树具体解释之插入(C语言实现)

    前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜 ...

  2. 算法起步之Prim算法

    原文:算法起步之Prim算法 prim算法是另一种最小生成树算法.他的安全边选择策略跟kruskal略微不同,这点我们可以通过一张图先来了解一下. prim算法的安全边是从与当前生成树相连接的边中选择 ...

  3. 一步一步写算法(之prim算法 下)

    原文:一步一步写算法(之prim算法 下) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉 ...

  4. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  5. 一步一步写算法(之prim算法 上)

    原文:一步一步写算法(之prim算法 上) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们讨论了图的创建.添加.删除和保存等问题.今 ...

  6. 数据结构与算法--最小生成树之Prim算法

    数据结构与算法--最小生成树之Prim算法 加权图是一种为每条边关联一个权值或称为成本的图模型.所谓生成树,是某图的一棵含有全部n个顶点的无环连通子图,它有n - 1条边.最小生成树(MST)是加权图 ...

  7. 算法导论学习-Dynamic Programming

    转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...

  8. 算法对比:Prim算法与Dijskra算法

    在图论中,求MST的Prim算法和求最短路的Dijskra算法非常像.可是我一直都对这两个算法处于要懂不懂的状态,现在,就来总结一下这两个算法. 最小生成树(MST)—Prim算法: 算法步骤: •将 ...

  9. 【Python排序搜索基本算法】之Prim算法

    Prim算法是实现最简单的最小生成树(MST)算法,适合于稠密图.要实现Prim算法,我们主要关注的是增量的变化,也就是从每个非树顶点到树顶点的最短距离,使得最后生成一棵包括所有顶点的树,并且这棵树的 ...

随机推荐

  1. ASP.NET Mvc Razor视图语法

    在ASP.NET MVC中有两套模版引擎,一套是ASPX,一套是Razor,从事过WebForms开发的朋友们,对于ASPX模版已经很熟悉了,下面我说一下我所熟悉的Razor模版引擎的一些语法,供大家 ...

  2. sencha architect/sencha touch , to prevent breakpoint lost when you debug

    add this to your loader config: Ext.Loader.setConfig({ disableCaching: false }); or : click 'applica ...

  3. npm常用命令解析

    npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...

  4. noj [1480] 懒惰的风纪委Elaine (多重背包)

    http://ac.nbutoj.com/Problem/view.xhtml?id=1480 [1480] 懒惰的风纪委Elaine 时间限制: 1000 ms 内存限制: 65535 K 问题描述 ...

  5. 分布式系统之CAP理论

    任老师第一节主要讲了分布式系统实现时候面临的八个问题,布置的作业就是这个,查询CAP理论. 笔者初次接触分布式,所以本文主要是一个汇总. 一.CAP起源 CAP原本是一个猜想,2000年PODC大会的 ...

  6. 【Uva 12558】 Egyptian Fractions (HARD version) (迭代加深搜,IDA*)

    IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索) 启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~) 这题... 理论上可以回溯,但是解答树非常恐怖,深度没有 ...

  7. ASP.NET UpdatePanel实现点击按钮无刷新且执行js脚本

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3770779.html]  *.aspx: <asp:ScriptManager ID=& ...

  8. easyui源码翻译1.32--NumberBox(数值输入框)

    前言 扩展自$.fn.validatebox.defaults.使用$.fn.numberbox.defaults重写默认值对象.下载该插件翻译源码 数值输入框是用来限制用户只能输入数值型数据的.他可 ...

  9. webbench的详细使用

    webbench是什么?是一款相当给力的网站压力测试工具.(优点自行搜索) 使用webbench需要两大步骤: 1.安装webbench 2.熟悉webbench命令 一.安装webbench 1.下 ...

  10. ANDROID_MARS学习笔记_S01原始版_011_XML

    一.代码 1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...