Prim算法求最小生成树

来源:互联网 发布:python scatter 气泡 编辑:程序博客网 时间:2024/04/26 07:26
//Prim 算法#include<stdio.h>#define MAX_VERTEX_NUM 20const  INFINITY=1000;typedef enum {DG,DN,AG,AN}GraphKind;typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{char vexs[MAX_VERTEX_NUM];  //顶点向量    AdjMatrix arcs;    //邻接矩阵int vexnum,arcnum;   //图的当前顶点数和边数    GraphKind kind;     //图的种类标志}MGraph;typedef struct{char vex;int mincost;}minside[MAX_VERTEX_NUM]; //辅助数组int LocateVex(MGraph &G,char u);void CreateAG(MGraph &G);int Minimum(minside MINI,MGraph &G);void Prim(MGraph &G,char u);void  ShowAG(MGraph &G);     int main(){MGraph(g);    CreateAG(g);ShowAG(g);Prim(g,g.vexs[0]);return 0;}int LocateVex(MGraph &G,char u)  //若G中存在顶点u,则返回该顶点在图中的位置;否则返回-1{for(int i=0;i<G.vexnum;i++)if(u==G.vexs[i])return i;return -1;}void CreateAG(MGraph &G){int i,j,k,w;char va,vb;printf("请输入无向连通网的顶点数和边数:");scanf("%d,%d",&G.vexnum,&G.arcnum);  //输入图的顶点数和边数printf("请依次输入各个顶点:\n");for(i=0;i<G.vexnum;i++){scanf("%s",&G.vexs[i]); //输入所有的顶点}for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j]=INFINITY;  //邻接矩阵中值都初始化为无穷大printf("请输入所有边的对应的两个端点及该边的权值:\n");for(k=0;k<G.arcnum;k++){scanf("%s%s%d",&va,&vb,&w);getchar();  //吃掉输入权值后输入的回车符i=LocateVex(G,va);  //i为点va在图G中的序号j=LocateVex(G,vb);  //j为点vb在图G中的序号G.arcs[i][j]=G.arcs[j][i]=w;   //将邻接矩阵中点va和点vb对应的边的值赋值为w}G.kind=AG;  //图的类型为无向图}int Minimum(minside MINI,MGraph &G){int i=0,j,k,min;while(!MINI[i].mincost)i++;min=MINI[i].mincost;// 第一个不为0的值k=i;for(j=i+1;j<G.vexnum;j++)if(MINI[j].mincost>0 && MINI[j].mincost<min)// 找到新的大于0的最小值{min=MINI[j].mincost;    k=j;}return k;   //返回最小值在辅助数组中的序号}void Prim(MGraph &G,char u){int i,j,k;minside minedge;k=LocateVex(G,u);         //k为顶点在图G中的序号for(i=0;i<G.vexnum;i++)   //初始化辅助数组{minedge[i].vex=u;    //顶点域全部赋值为u点        minedge[i].mincost=G.arcs[k][i];   //距离域全部赋值为u到其他点的距离}minedge[k].mincost=0;   // 初始,U={u}for(i=1;i<G.vexnum;i++){k=Minimum(minedge,G);  //k为辅助数组中值最小的点对应的序号printf("%c-%c\n",minedge[k].vex,G.vexs[k]);  // 输出生成树的边minedge[k].mincost=0;  // 第k顶点并入U集for(j=0;j<G.vexnum;j++)if(G.arcs[k][j]<minedge[j].mincost){// 新顶点并入U集后重新选择最小边minedge[j].vex=G.vexs[k];minedge[j].mincost=G.arcs[k][j];}}}void  ShowAG(MGraph &G)     //输出邻接矩阵{int i,j;printf("输入的无向连通图所对应的邻接矩阵为:(1000表示无穷大)\n");    for(i=0;i<G.vexnum;++i) {for(j=0;j<G.vexnum;++j)printf("%d\t",G.arcs[i][j]);printf("\n");}}


 

0 0
原创粉丝点击