数据结构书P189---图7.34
#include <stdio.h> #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ typedef struct { int edges[MAXV][MAXV];//邻接矩阵 int vexnum,arcnum; //顶点数,弧数 } MGraph;//图的邻接矩阵类型 void init(MGraph &g);//初始化邻接矩阵 void DispMat(MGraph g);//输出邻接矩阵g void prim(MGraph g,int v); int main() { int u=3; MGraph g;//图的邻接矩阵 init(g);//初始化邻接矩阵 printf("图G的邻接矩阵:\n"); DispMat(g); printf("\n"); printf("普里姆算法求解结果:\n"); prim(g,0); printf("\n"); return 0; } void prim(MGraph g,int v)//从v号节点开始---生成最小生成树 { //(V-U)---未加入最小生成树的点 //U---已加入最小生成树的点 int i,j,k; int MinCost[MAXV]; //(V-U)中各点离U的最小距离 int MinCostNum[MAXV];//(V-U)中各点离U的最小距离对应在U中的点 int min;//min记录离U最近的距离 MinCost[v]=0;//v加入U for (i=0;i<g.vexnum;i++) //初始化MinCost[]和MinCostNum[] { MinCost[i]=g.edges[v][i];//每个节点距v的值 MinCostNum[i]=v;//(V-U)中的节点i距U中最近的点是v } for (i=1;i<g.vexnum;i++) { min=INF; for (j=0;j<g.vexnum;j++)//在(V-U)中找出离U最近的顶点k if (MinCost[j]!=0 && MinCost[j]<min) //未加入U(即V-U)中的点且距离U最近 { min=MinCost[j]; k=j; //k记录离U最近的顶点 } if(min!=INF)//(V-U)中离U最近点k--距U中最近的一个点是MinCostNum[k] printf("边(%d,%d)权为:%d\n",MinCostNum[k],k,min); MinCost[k]=0;//标记k已经加入U //更新(V-U)中的点///////////////////// for (j=0;j<g.vexnum;j++)//由于顶点k的新加入而修改数组lowcost和closest if (MinCost[j]!=0 && g.edges[k][j]<MinCost[j]) { MinCost[j]=g.edges[k][j]; MinCostNum[j]=k; } ///////////////////////////////////////// } } void init(MGraph &g) { int i,j; g.vexnum=6;g.arcnum=10; int A[MAXV][11]; for (i=0;i<g.vexnum;i++) for (j=0;j<g.vexnum;j++) A[i][j]=INF; //数据结构书P189---图7.34 A[0][2]=10;A[0][4]=30;A[0][5]=100; A[1][2]=5; A[2][3]=50; A[3][5]=10; A[4][3]=20;A[4][5]=60; /*for (i=0;i<g.vexnum;i++)//使邻接矩阵对称 for (j=0;j<g.vexnum;j++) A[j][i]=A[i][j];*/ for (i=0;i<g.vexnum;i++)//建立邻接矩阵 for (j=0;j<g.vexnum;j++) g.edges[i][j]=A[i][j]; } void DispMat(MGraph g)//输出邻接矩阵g { int i,j; for (i=0;i<g.vexnum;i++) { for (j=0;j<g.vexnum;j++) if (g.edges[i][j]==INF) printf("%3s","∞"); else printf("%3d",g.edges[i][j]); printf("\n"); } } /* 图G的邻接矩阵: ∞ ∞ 10 ∞ 30100 ∞ ∞ 5 ∞ ∞ ∞ ∞ ∞ ∞ 50 ∞ ∞ ∞ ∞ ∞ ∞ ∞ 10 ∞ ∞ ∞ 20 ∞ 60 ∞ ∞ ∞ ∞ ∞ ∞ 普里姆算法求解结果: 边(0,2)权为:10 边(0,4)权为:30 边(4,3)权为:20 边(3,5)权为:10 */