刚刚发了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. SysTick 定时器的使用

    SysTick是STM32中的一个24位的定时器. Cortex‐M3处理器内部包含了一个简单的定时器.因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简.该定时器的时钟 ...

  2. Android dip(dp) 与 sp的自适应问题

    本文转载于:http://www.oschina.net/question/272860_70761 今天碰到的一个问题,感觉应该其他人也会碰到,拿来分享一下. 我们都知道android在开发配置界面 ...

  3. 设置iframe背景透明

    <iframe allowtransparency="true" src="page.htm" frameborder="0" > ...

  4. spring源码学习之:spring容器的applicationContext启动过程

    Spring 容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将 BeanFactory看成汽车的发动机, ...

  5. PHP pdao用法总结

    $sql = 'SELECT name, colour, calories     FROM fruit     WHERE calories < :calories AND colour =  ...

  6. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

  7. eclipse cdt代码悬停窗口背景颜色设置(转载)

    在eclipse中编写C++代码时,有一个很方便的功能,是当鼠标停放在某一个函数或变量上不同时,会出现一个悬停框,显示该函数或变量的声明 体.但是, 从Ubuntu 10.04之后,这个悬停框便出现了 ...

  8. Python3下map函数的显示问题

    map函数是Python里面比较重要的函数,设计灵感来自于函数式编程.Python官方文档中是这样解释map函数的: map(function, iterable, ...) Return an it ...

  9. ORA-12170: TNS: 连接超时

    ORA-12170: TNS: 连接超时 如果在本机可以正常使用,可是到局域网中的其他机器就出现“ORA-12170:TNS:连接超时 解决方法: 1.cmd-----ping ip地址 查看网络问题 ...

  10. unity, 查看build版log文件

    http://blog.theknightsofunity.com/accessing-unity-game-logs/