#include<iostream>
#include<cstring>
using namespace std;
typedef char DataType;
#define MAXV 50
#define MAXE 100
#define INFINITY 65535
typedef struct Graph
{
DataType vexs[MAXV];
int arc[MAXV][MAXV];
int VNum,ENum;
}MyGraph;
typedef struct shortEdge
{
int adjvex;
int lowcost;
};
void CreatGraph(MyGraph *G);
int MinEdge(MyGraph *G,shortEdge *shortE);
void Prim(MyGraph *G,shortEdge *shortE);
void CreatGraph(MyGraph *G)
{
int i,j,k,w;
cout<<"请输入图的顶点数和边数:";
cin>>G->VNum>>G->ENum;
cout<<"请输入图的顶点信息:";
for(i=0;i<G->VNum;i++)
{
cin>>G->vexs[i];
}
for(i=0;i<G->VNum;i++)
for(j=0;j<G->ENum;j++)
{
G->arc[i][j]=INFINITY;
}
for(k=0;k<G->ENum;k++)
{
cout<<"请输入边(vi,vj)所依附的边的下标i、j的值以及权值w:"<<endl;
cin>>i>>j>>w;
G->arc[i][j]=w;
G->arc[j][i]=w;
}
}
/*实现在shortE中查找最小权值*/
int MinEdge(MyGraph *G,shortEdge *shortE)
{
int i;
int index=-1;
unsigned int min=INFINITY;
for(i=0;i<G->ENum;i++)
{
if(shortE[i].lowcost<min&&shortE[i].lowcost!=0)
{
min=shortE[i].lowcost;
index=i;
}
}
return index;
}
void Prim(MyGraph *G,shortEdge* shortE)
{
int i,j,k;
for(i=1;i<G->ENum;i++)
{
shortE[i].lowcost=G->arc[0][i];
shortE[i].adjvex=0;
}
shortE[0].lowcost=0;
for(i=1;i<G->VNum;i++)
{
k=MinEdge(G,shortE);
cout << G->vexs[shortE[k].adjvex]
<< "→"
<<G->vexs[k]
<<"("
<<shortE[k].lowcost
<<")"<<endl;
shortE[k].lowcost=0;
for(j=1;j<G->VNum;j++)
if(G->arc[k][j]<shortE[j].lowcost){
shortE[j].lowcost=G->arc[k][j];
shortE[j].adjvex=k;
}
}
}
int main()
{
MyGraph *G=new MyGraph;
shortEdge *SE=new shortEdge;
CreatGraph(G);
cout<<"最小生成树(PRIM):"<<endl;
Prim(G,SE);
}