MST_prim

    刚刚发了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;

}

时间: 2024-12-25 04:42:14

MST_prim的相关文章

数据结构图的常用算法总结

本人在校期间写了一个win32应用程序,用于回顾算法导论图的常用算法(图中边的权值为两个圆心的像素点的距离) 1.dijkstra算法求两点之间最短路径: 贪心算法用优先队列实现,每次选择距离起点路径和最短的顶点弹出队列,此顶点最短路径就已经确定 初始图如下 选择起点如W 选择终点如下: 显示路线: 1) 2) 3) 4) 打开数据,第一行为W距离S点距离,剩下为边的距离一遍参考 470 A <-> D 120 D <-> C 71 C <-> E 93 E <-

贪心法

贪心法(Greedy Approach)又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解.如单源最短路经问题,最小生成树问题等.在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似. 贪心法的设计思想 当一个问题具有以

数据结构图的经常使用算法总结

本人在校期间写了一个win32应用程序,用于回想算法导论图的经常使用算法(图中边的权值为两个圆心的像素点的距离) 1.dijkstra算法求两点之间最短路径: 贪心算法用优先队列实现,每次选择距离起点路径和最短的顶点弹出队列,此顶点最短路径就已经确定 初始图例如以下 选择起点如W 选择终点例如以下: 显示路线: 1) 2) 3) 4) 打开数据,第一行为W距离S点距离.剩下为边的距离一遍參考 470 A <-> D 120 D <-> C 71 C <-> E 93 E

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

克鲁斯卡尔: function T=MST_Kruskal(G) n=0; if isfield(G,'w') && ~isempty(G.w) && size(G.w,1)==size(G.w,2) W=G.w;n=size(W,1); end if isfield(G,'e') && ~isempty(G.e) && size(G.e,2)==3 E=G.e; n=max(max(E(:,1:2)); elseif n==0 error(

NP完全性理论与近似算法

转自:http://www.cnblogs.com/chinazhangjie/archive/2010/12/06/1898070.html 一.图灵机 根据有限状态控制器的当前状态及每个读写头读到的带符号,图灵机的一个计算步可实现下面3个操作之一或全部. (1)改变有限状态控制器中的状态. (2)清除当前读写头下的方格中原有带符号并写上新的带符号. (3)独立地将任何一个或所有读写头,向左移动一个方格(L)或向右移动一个方格(R)或停在当前单元不动(S). k带图灵机可形式化地描述为一个7元