转: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;
}