刚刚发了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. Activity——思维导图

  2. 最短路--floyd算法模板

    floyd算法是求所有点之间的最短路的,复杂度O(n3)代码简单是最大特色 #include<stdio.h> #include<string.h> ; const int I ...

  3. 关于Lua程序设计{读书笔记}

    1.lua中的标识符可以是由任意字母.数字和下划线构成的字符串,但不能以数字开头.2.lua将通常类似"_VALUE"的标识符作为保留标识符3.lua的保留字 and break ...

  4. The EM Algorithm

    EM是我一直想深入学习的算法之一,第一次听说是在NLP课中的HMM那一节,为了解决HMM的参数估计问题,使用了EM算法.在之后的MT中的词对齐中也用到了.在Mitchell的书中也提到EM可以用于贝叶 ...

  5. 5分钟实现Android中更换头像功能

    写在前面:更换头像这个功能在用户界面几乎是100%出现的.通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置.功能相关截图如下: 下面我们直接看看完整代码吧: 1 2 3 4 5 6 7 ...

  6. 最大化 AIX 上的 Java 性能,第 4 部分: 监视流量

    http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf4.html 最大化 AIX 上的 Java 性能,第 ...

  7. js调用百度地图API创建地图,搜索位置

    实现代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...

  8. gridview+checkbox的各种操作【转】

    来源:http://hi.baidu.com/heavensxq/item/29736dcfbdc30403c710b2b1 1.首先如何在gridview中加入一个checkbox,注意不是chec ...

  9. Jquery遍历元素

    页面中所有的checkBox遍历: <script type="text/javascript" src="/jquery/jquery.js">& ...

  10. C#去掉字符串中的特殊字符

    方案一: string except_chars = ": ‘ ! @ # % … & * (  ^  &  ¥  , . , .)$"; string src = ...