Prim 最小生成樹
阿新 • • 發佈:2018-11-15
轉:https://blog.csdn.net/zguiz/article/details/54633115
#include<stdio.h> #include<string.h> using namespace std; #define MAX_VERTEX_NUM 20 #define MAX_INT 999 #define ERROR -1 #define OK 1 struct node { int adjvex; int lowcost; }closedge[MAX_VERTEX_NUM]; //輔助陣列 typedef struct { int vex[MAX_VERTEX_NUM]; //圖的節點 int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //圖的矩陣 每條邊的權 int vexnum,arcnum; }MGraph; //圖的資訊 int Locate(MGraph *G,int a) //定位 { for(int i=0;i<G->vexnum;i++) { if(a==G->vex[i]) return i; } return ERROR; } int CreateUDN(MGraph *G) { printf("請輸入頂點數和邊數: \n"); scanf("%d%d",&G->vexnum,&G->arcnum); printf("請輸入具體的頂點值: \n"); for(int i=0;i<G->vexnum;i++) { scanf("%d",&G->vex[i]); } for(int i=0;i<G->vexnum;i++) { for(int j=0;j<G->vexnum;j++) { G->arc[i][j]=MAX_INT; //矩陣的初始化 } } printf("請輸入各邊的兩個頂點以及邊的權: \n"); for(int i=0;i<G->arcnum;i++) { int v1,v2; int w; scanf("%d%d%d",&v1,&v2,&w); int n,m; n=Locate(G,v1); m=Locate(G,v2); G->arc[n][m]=w; G->arc[m][n]=G->arc[n][m]; //矩陣的賦值 每條邊的權賦值 } return OK; } int minimum(MGraph G) //查詢數組裡最小的權 { int Min=MAX_INT; int index=-1; for(int i=0;i<G.vexnum;i++) { if(Min>closedge[i].lowcost&&closedge[i].lowcost!=0) { Min = closedge[i].lowcost; index = i; } } return index; } void MiniSpanTree(MGraph G,int u) { int k=Locate(&G,u); for(int i=0;i<G.vexnum;i++) { if(i!=k) closedge[i].adjvex=u; closedge[i].lowcost=G.arc[k][i]; } closedge[k].lowcost=0; //新頂點入 U for(int i=1;i<G.vexnum;i++) { k=minimum(G); printf("%d -> %d\n",closedge[k].adjvex,G.vex[k]); closedge[k].lowcost = 0; //新頂點入 U for(int j=0;j<G.vexnum;j++) { if(G.arc[k][j]<closedge[j].lowcost) { closedge[j].adjvex = G.vex[k]; closedge[j].lowcost = G.arc[k][j]; } } } } int main() { MGraph(G); CreateUDN(&G); MiniSpanTree(G,1); printf("\n"); return 0; }