普里姆(Prim)算法

转载 2012年03月24日 23:43:29
1.基本思想:设G=(V, E)是具有n个顶点的连通网,T=(U, TE)是G的最小生成树, T的初始状态为U={u0}(u0∈V),TE={},重复执行下述操作:在所有u∈U,v∈V-U的边中找一条代价最小的边(u, v)并入集合TE,同时v并入U,直至U=V。即:

     (1)从连通网络 G = { V, E }中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。

  (2)以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把它的顶点加入到集合U中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合U中为止。

示例:

昨晚上学长讲了最小生成树中的普利姆算法,不过没有将代码实现,今天纠结了一天,嘿嘿,终于搞明白了一点,这个题是一个赤裸裸的最小生成树问题,也许会有很多错误,希望有人能帮我找出.

题目:布线问题

原题地址:请点击

AC代码:

  1. #include<stdio.h>   
  2. #include<string.h>   
  3. int m[502][502],flag[502];  
  4. int prim(int n)     //用普利姆算法找最小生成树函数   
  5. {  
  6.     int i,j,sum=0,min,temp;  
  7.     i=1;  
  8.     for(int k=1;k<n;k++)  
  9.     {  
  10.         flag[i]=1;   //i为研究对象   flag为标记该点是否研究过,确定最小分支   
  11.         min=999999;  
  12.         for(j=1;j<=n;j++)             //更新各个点对应的最小值   
  13.         {  
  14.             if(m[0][j]==0)  
  15.                 m[0][j]=m[i][j];         
  16.             else if(!flag[j]&&m[0][j]>m[i][j])  
  17.                 m[0][j]=m[i][j];  
  18.         }  
  19.         for(j=2;j<=n;j++)  
  20.         {  
  21.             if(!flag[j] &&min>m[0][j])               //确定该研究对象中的最小分支   
  22.             {  
  23.                 min=m[0][j];  
  24.                 temp=j;  
  25.             }  
  26.         }  
  27.         i=temp;  
  28.         sum+=min;  
  29.     }  
  30.     return sum;  
  31. }  
  32. int main()  
  33. {  
  34.     int n,i,j,k,l,p,weight;  
  35.     scanf("%d",&n);  
  36.     while(n--)  
  37.     {  
  38.         int min=9999999;  
  39.         memset(m,0,sizeof(m));  
  40.         memset(flag,0,sizeof(flag));  
  41.         scanf("%d%d",&k,&l);  
  42.         for(p=1;p<=l;p++)  
  43.         {  
  44.             scanf("%d%d%d",&i,&j,&weight);  
  45.             m[i][j]=weight;     //将各个点添加到二维数组中   
  46.             m[j][i]=weight;  
  47.         }  
  48.         for(p=1;p<=k;p++)  
  49.         {  
  50.             scanf("%d",&weight);          //找出最少费用   
  51.             if(min>weight)  
  52.                 min=weight;  
  53.         }  
  54.         printf("%d\n",prim(k)+min);  
  55.     }  
  56.     return 0;  
  57. }  

Prim(普利姆)算法+Kruskal(克鲁斯卡尔)算法

Prim(普利姆)算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:...
  • oenheng
  • oenheng
  • 2016年08月19日 16:11
  • 623

最小生成树——prim 普里姆算法 Kruskal 克鲁斯卡尔算法

假设 N-(V,{E})s
  • xtji1988
  • xtji1988
  • 2014年07月20日 15:37
  • 388

普利姆(prim)算法和克鲁斯卡尔(kruskal)算法

连通网的最小生成树算法: 1.普里姆算法——”加点法”。 假设N=(V,{E})是连通网,TE为最小生成树的边集合。 (1)初始U={u0}(u0∈V),TE=φ; (2)在所有u∈U,...
  • Solo95
  • Solo95
  • 2016年05月18日 17:36
  • 1251

普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法

普里姆算法(Prim)和克鲁斯卡尔(Kruskal)算法   普里姆算法的基本思想: 取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w。添加顶点w的条件为:w 和已在生成...
  • zhupengqq
  • zhupengqq
  • 2016年07月06日 19:51
  • 498

最小生成树——Prim(普利姆)算法

【0】README0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解Prim算法的idea 并用 源代码加以实现;【1】Prim算法相关1.1)计算最小生成树的一种方法是使其连续...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2015年11月20日 15:21
  • 482

最小生成树之克鲁斯卡尔(Kruskal)算法、普里姆(prim)算法

问题描述:                   在一个具有几个顶点的连通图G中,如果存在子图G'包含G中所有顶点和一部分边,且不形成回路,则称G'为图G的生成树,其中代价最小的生成树则称为最小生成树...
  • Candy1232009
  • Candy1232009
  • 2012年01月04日 11:09
  • 6734

普里姆(Prim)求最小生成树

一、普里姆(Prim)算法  1.基本思想:设G=(V, E)是具有n个顶点的连通网,T=(U, TE)是G的最小生成树, T的初始状态为U={u0}(u0∈V),TE={},重复执行下述操作:在所有...
  • Hackbuteer1
  • Hackbuteer1
  • 2011年06月22日 16:06
  • 3876

最小生成树算法---普里姆Prim算法

1. 邻接矩阵存储//图的邻接矩阵存储表示 #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 typedef enum {DG, DN, UD...
  • hustspy1990
  • hustspy1990
  • 2010年11月29日 19:43
  • 2397

最小生成树之Prim(普里姆)算法

最小生成树之Prim(普里姆)算法
  • u012965373
  • u012965373
  • 2015年08月11日 15:18
  • 1339

普里姆算法(Prim算法求最小生成树)

普里姆算法的基本思想:普里姆算法是一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。时间复杂度为O(n^2)。 从连通网络N = { V, E }中的某一顶点u0出发,选择与它...
  • xinlingchengbao
  • xinlingchengbao
  • 2016年08月05日 18:59
  • 1065
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:普里姆(Prim)算法
举报原因:
原因补充:

(最多只允许输入30个字)