刚刚发了mst 的kruskal,现在再来一发,说一说prim咯。

    prim适用于稠密图。

    与kruskal不同,prim是从一个点开始,不断加入新的点直至连通所有点。

    讲讲prim的过程,我们假定有2个集合u和v,u存放所有已经加入的点,v存放还没有加入的点,先把点编号为0~n-1,从0点开始,把0加入u,我们扫描所有和0连接的点,不连接则为INF,把其中与0的边权值最小的点加入到u,再继续扫描连接u和v的所有边,把其中权值最小的边的点加入到u,再继续扫描所有连接u和v的边,把其中权值最小的边的点加入到u,嗯,就是这样一直扫描,直至所有点都在u。

结合代码讲讲吧。

下面这份代码也是来自fanal爷kuangbin,他的博客地址kuangbin.net,我不是抄袭,嗯,他说可以的。

这里是使用邻接矩阵。

标号从0开始,0~n-1

代码手打,没有语法高亮。

const int INF=0x3f3f3f;

const int MAXN=110;//最大节点数

bool vis[MAXN];//是否在集合u中,初始化为false

int lowc[MAXN];//扫描时存储的边的信息,初始化为INF

int cost[MAXN][MAXN];//初始化为INF

int prim(int n)//传入n,返回最小权值 ,不连通,返回-1

{

  int ans=0;//记得初始化

  memset(vis,false,sizeof(vis));

  vis[0]=true;//先拿一个点

  for(int i=1;i<n;i++)

   lowc[i]=cost[0][i];

  for(int i=1;i<n;i++)//从1开始,n-1次,拿n-1个点,若是节点编号为1~n,则从2开始,i<=n,也是拿n-1个点

  {

    int mic=INF;

    int p=-1;

    for(int j=0;j<n;j++)

    if(!vis[j]&&lowc[j]<minc)

    {

      minc=lowc[j];

      p=j;

    }

    if(minc==INF)

      return -1;

    ans+=minc;

    vis[p]=true;

    for(int j=0;j<n;j++)

    if(!vis[j]&&cost[p][j]<lowc[j])

      lowc[j]=cost[p][j];

  }

  return ans;

}

MST_prim的更多相关文章

  1. NOIP常见模板集合

    Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以cla ...

  2. NP完全性理论与近似算法

    转自:http://www.cnblogs.com/chinazhangjie/archive/2010/12/06/1898070.html 一.图灵机 根据有限状态控制器的当前状态及每个读写头读到 ...

  3. 最小生成数 克鲁斯卡尔 普里姆 matlab

    克鲁斯卡尔: function T=MST_Kruskal(G) n=0; if isfield(G,'w') && ~isempty(G.w) && size(G.w ...

  4. 最小生成树基础算法(Prim + Krustal)

    最小生成树问题的引入: 对于一个无向图G(V, E),需要用图中的n - 1条边连接图中的n个顶点并且不产生回路所产生的树就叫做生成树,其中权值总和最小的就是最小生成树. 如何求解最小生成树问题: 譬 ...

随机推荐

  1. jquery 按回城 等于提交按钮

    $(document).keydown(function(e){                    if(e.keyCode==13){                        $('.bu ...

  2. java大数

    java大数还是很好用的! 基本加入: import java.math.BigInteger; import jave.math.BigDecimal; 分别是大数和大浮点数. 首先读入可以用: S ...

  3. C# WinForm获取当前路径汇总

    摘自:http://greatverve.cnblogs.com/archive/2011/12/15/winform-path.html Winform获取应用程序的当前路径的方法集合,具体如下,值 ...

  4. ruby杂记

    ruby基本类中的方法:puts Object.private_instance_methods

  5. 在svg里面画虚线

    使用stroke-dasharray="3 2"  属性,其中3和2分别表示画的长度和间隙的长度 比如 <line x1="0" y1="5&q ...

  6. Python_进程、线程及协程

    一.Python进程 IO密集型----多线程 计算密集型----多进程 1.单进程 from multiprocessing import Process def foo(i): print('你好 ...

  7. MongoDB管理与开发精要 书摘

    摘自:<MongoDB管理与开发精要>         性能优化 创建索引 限定返回结果条数 只查询使用到的字段,而不查询所有字段 采用capped collection 采用Server ...

  8. C# toString()转换详细(转)

    文章转自:http://blog.csdn.net/xiaoguang44/article/details/6988418 字符型转换为字符串 // C 货币 2.5.ToString("C ...

  9. TKinter之窗口美化 窗口大小、图标等

    设置窗口大小.设置窗口标题.设置窗口图标 效果图: 代码示例: #!/usr/bin/env python # _*_ coding:utf-8 _*_ from Tkinter import * r ...

  10. git同一文件由于文件名大小写不同导致不能合并

    问题 git中如果两个分支添加了同一个文件,但是文件名大小写不同会出现合并问题. 应为git中大小写不同被视为不同文件,但是windows操作系统中不区分文件名大小写.所以在合并是总是没有办法合并. ...