码迷,mamicode.com
首页 > 编程语言 > 详细

普里姆(Prim)算法

时间:2015-03-03 18:25:46      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

                    技术分享

 

  1 /*
  2 普里姆算法的主要思想:
  3     利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录
  4 */
  5 # include <stdio.h>
  6 
  7 typedef char VertexType;//定义顶点类型
  8 typedef int EdgeType;//定义边上的权值类型
  9 # define MAX_VERTEX 100//最大顶点个数
 10 # define INFINITY 65535//用65535代表无穷大
 11 
 12 typedef struct
 13 {//邻接矩阵存储结构
 14     VertexType vexs[MAX_VERTEX];//顶点表
 15     EdgeType arc[MAX_VERTEX][MAX_VERTEX];//邻接矩阵
 16     int numVertexs, numEdges;//图中当前的顶点数和边数
 17 
 18 }MGraph;
 19 
 20 void CreateMGraph(MGraph *G)
 21 {
 22     int i, j;
 23     G->numEdges=15;
 24     G->numVertexs=9;
 25 
 26     for (i = 0; i < G->numVertexs; i++)
 27     {
 28         for ( j = 0; j < G->numVertexs; j++)
 29         {
 30             if (i==j)
 31                 G->arc[i][j]=0;
 32             else
 33                 G->arc[i][j] = G->arc[j][i] = INFINITY;
 34         }
 35     }
 36 
 37     G->arc[0][1]=10;
 38     G->arc[0][5]=11; 
 39     G->arc[1][2]=18; 
 40     G->arc[1][8]=12; 
 41     G->arc[1][6]=16; 
 42     G->arc[2][8]=8; 
 43     G->arc[2][3]=22; 
 44     G->arc[3][8]=21; 
 45     G->arc[3][6]=24; 
 46     G->arc[3][7]=16;
 47     G->arc[3][4]=20;
 48     G->arc[4][7]=7; 
 49     G->arc[4][5]=26; 
 50     G->arc[5][6]=17; 
 51     G->arc[6][7]=19; 
 52 
 53     for(i = 0; i < G->numVertexs; i++)
 54     {
 55         for(j = i; j < G->numVertexs; j++)
 56         {
 57             G->arc[j][i] =G->arc[i][j];
 58         }
 59     }
 60 
 61 }
 62 
 63 void MinSpanTree_Peim (MGraph &G)
 64 {//普里姆算法,最小生成树
 65     int min, i, j, k;
 66     int add=0;
 67     int adjvex[MAX_VERTEX];
 68     int lowcost[MAX_VERTEX];
 69     lowcost[0] = 0;
 70     adjvex[0] = 0;
 71 
 72     for (i=1; i<G.numVertexs; i++)
 73     {//若是从v0顶点开始查找,从顶点v0的矩阵全部赋值到lowcost数组中,adjvex数组全部为0;
 74         lowcost[i] = G.arc[0][i];//二维数组存放的权值
 75         adjvex[i] = 0;//所有都为0
 76     }
 77 
 78     for (i=1; i<G.numVertexs; i++)
 79     {//最小生成树
 80         min = INFINITY;//无穷大
 81         j=1;
 82         k=0;
 83 
 84         while (j < G.numVertexs)
 85         {//查找lowcost数组中最小的值,把最小的值赋给min,且最小值的下表赋给k
 86             if (lowcost[j]!=0 && lowcost[j]<min)
 87             {
 88                 min = lowcost[j];//存放最小的权值
 89                 k = j;//把存放最小权值的顶点下标
 90             }
 91             j++;
 92         }
 93         printf ("(%d——%d)\n", adjvex[k], k);
 94         add = add + G.arc[adjvex[k]][k];
 95         /*因为52~56行已经把adjvex数组全部赋值为0,所以一开始打印出来的就是0,后来打印出来的就是以上一个在lowcost
 96         数组中最小值的下表(下表对应的顶点),顶点的矩阵中比当前lowcost数组中的值还要小的值的下标,和lowcost数组中最小值的下标*/
 97         lowcost[k] = 0;
 98         //若刚才存放最小权值的顶点是1(k=1),则下面就for循环就从发1的二位数组继续寻找最小生成树
 99         for (j=1; j<G.numVertexs; j++)
100         {//以在lowcost数组中最小值的下表作为二位数组的第一个下标与当前lowcos数组中的值进行比较。
101          //查找最小值
102             if (lowcost[j]!=0 && G.arc[k][j]<lowcost[j])//t
103             {
104                 lowcost[j] = G.arc[k][j];//0
105                 adjvex[j] = k;
106             }
107         }
108     }
109     printf ("%d\n", add);
110 
111     return;
112 }
113 
114 int main (void)
115 {
116     MGraph G;
117     CreateMGraph (&G);
118     MinSpanTree_Peim (G);
119 
120     return 0;
121 }
122 
123 /*
124                                         在vc++6.0运行结果:
125 请输入顶点数和边数:9 15
126 请输入第1个顶点信息:v0
127 请输入第2个顶点信息:v1
128 请输入第3个顶点信息:v2
129 请输入第4个顶点信息:v3
130 请输入第5个顶点信息:v4
131 请输入第6个顶点信息:v5
132 请输入第7个顶点信息:v6
133 请输入第8个顶点信息:v7
134 请输入第9个顶点信息:v8
135 请输入边(vi,vj)上的下表i,下表j和权w:0 1 10
136 请输入边(vi,vj)上的下表i,下表j和权w:0 5 11
137 请输入边(vi,vj)上的下表i,下表j和权w:1 6 16
138 请输入边(vi,vj)上的下表i,下表j和权w:1 2 18
139 请输入边(vi,vj)上的下表i,下表j和权w:1 8 12
140 请输入边(vi,vj)上的下表i,下表j和权w:2 8 8
141 请输入边(vi,vj)上的下表i,下表j和权w:2 3 22
142 请输入边(vi,vj)上的下表i,下表j和权w:8 3 21
143 请输入边(vi,vj)上的下表i,下表j和权w:6 5 17
144 请输入边(vi,vj)上的下表i,下表j和权w:6 3 24
145 请输入边(vi,vj)上的下表i,下表j和权w:6 7 19
146 请输入边(vi,vj)上的下表i,下表j和权w:3 4 20
147 请输入边(vi,vj)上的下表i,下表j和权w:3 7 16
148 请输入边(vi,vj)上的下表i,下表j和权w:4 7 7
149 请输入边(vi,vj)上的下表i,下表j和权w:4 5 26
150 (0——1)
151 (0——5)
152 (1——8)
153 (8——2)
154 (1——6)
155 (6——7)
156 (7——4)
157 (7——3)
158 Press any key to continue
159     
160 */

 

普里姆(Prim)算法

标签:

原文地址:http://www.cnblogs.com/bebug/p/4311561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!