普里姆算法

xiaoxiao2021-02-27  306

#include<iostream> #include<stdio.h> #define Max_vertex_num 100 #define MAXVEX 100 #define INFINITY 999 using namespace std; typedef   struct {          //图结构       char  vexs[Max_vertex_num] ;  //顶点数组       int   arc[Max_vertex_num][Max_vertex_num];//矩阵数组       int   numVertexes,arcnum;  //顶点数 }  ALGraph; //找到位置顶点所在的位置 int LocateVex(ALGraph G,char u)  {    /*初始条件:图G存在,u和G中顶点有相同特征 */     /*操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */    int i;    for(i=0;i<G.numVertexes;++i)      if(u==G.vexs[i])        return i;    return -1;  } int  CreateUDN(ALGraph &G){     int i,k,j;     cout<<"输入图的顶点数目和边的数目:";      char v1,v2;      int quan;     cin>>G.numVertexes>>G.arcnum;     //输入总顶点数,总边数     cout<<"输入图的顶点:";      //矩阵初始化:     for(int i=0;i<G.numVertexes;i++)     for(int j=0;j<G.numVertexes;j++)            G.arc[i][j]=999;          //输入权值信息     for(i = 0; i<G.numVertexes; ++i)        cin>>G.vexs[i];                 //依次输入顶点的信息      cout<<"输入图的边的关联的两个顶点以及这条边的权值:";     for(k = 0; k<G.arcnum;++k){ //构造邻接矩阵       cin>>v1>>v2>>quan; //输入一条边依附的顶点       i = LocateVex(G, v1);       j = LocateVex(G, v2);  //确定v1和v2在G中的位置       G.arc[j][i]=quan;       G.arc[i][j]=G.arc[j][i] ; //置<v1, v2>的对称边<v2, v1>为1     }//for     //展示矩阵      cout<<"矩阵展示:"<<endl;        for(int i=0;i<G.numVertexes;i++){         for(int j=0;j<G.numVertexes;j++){                if(G.arc[i][j])             cout<<G.arc[i][j]<<" ";            }          cout<<endl;         }    return 1; }//CreateUDN /* Prim算法生成最小生成树  */ void MiniSpanTree_Prim(ALGraph MG) {     int  minn, i, j, k;     int adjvex[MAXVEX];/* 保存相关顶点下标 */     int lowcost[MAXVEX];/* 保存相关顶点间边的权值 */     lowcost[0] = 0;/* 初始化第一个权值为0,即v0加入生成树 */     /* lowcost的值为0,在这里就是此下标的顶点已经加入生成树 */     adjvex[0] = 0;/* 初始化第一个顶点下标为0 */     cout << "最小生成树的边为:" << endl;     for (i = 1; i < MG.numVertexes; i++)     {         lowcost[i] = MG.arc[0][i];/* 将v0顶点与之有边的权值存入数组,相当于矩阵的一行 */         adjvex[i] = 0;/* 初始化都为v0的下标 */     }     for (i = 1; i < MG.numVertexes; i++)     {         minn = INFINITY; /* 初始化最小权值999 */         j = 1;         k = 0;//用来记住最小的下标         while (j <=MG.numVertexes)/* 循环全部顶点 */         {             if (lowcost[j] != 0 && lowcost[j] < minn)/* 如果权值不为0且权值小于min */             {                 minn = lowcost[j];/* 则让当前权值成为最小值 */                 k = j;/* 将当前最小值的下标存入k */             }             j++;         }         cout << "(" << MG.vexs[adjvex[k]] << ", " <<  MG.vexs[k] << ")" << "  "; /* 打印当前顶点边中权值最小的边的两个顶点 */         lowcost[k] = 0;/* 将当前顶点的权值设置为0,表示此顶点已经完成任务 */         for (j = 1; j < MG.numVertexes; j++)/* 循环所有顶点 */         {             /* 如果下标为k顶点各边权值小于此前这些顶点未被加入生成树权值 */             if (lowcost[j] != 0 && MG.arc[k][j] < lowcost[j])             {                 lowcost[j] = MG.arc[k][j];/* 将较小的权值存入lowcost相应位置 */                 adjvex[j] = k;/* 将下标为k的顶点存入adjvex,进入集合,从k继续向下循环 */             }         }     }     cout << endl; } int main(){      /*可以直接粘贴复制        4 5        a b c d        a b 2 a c 3 a d 1 b d 4 c d 1        */         ALGraph MG;         CreateUDN(MG);         MiniSpanTree_Prim(MG); }
转载请注明原文地址: https://www.6miu.com/read-3726.html

最新回复(0)