#include<iostream>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
const int MAXVEX = 100;
const int INFINITY = 65535;
typedef struct
{
VertexType vexs[MAXVEX];
EdgeType arc[MAXVEX][MAXVEX];
int numVertexes,numEdges;
}MGraph;
void CreateMGraph_Undirected(MGraph *G)
{
int i,j,k,w;
cout<<"请输入顶点数和边数:"<<endl;
cin>>G->numVertexes>>G->numEdges;
cout<<"请输入顶点名称:"<<endl;
for(i = 0;i < G->numVertexes;++i)
{
cin>>G->vexs[i];
}
for(i = 0;i < G->numVertexes;++i)
{
for(j = 0;j < G->numVertexes;++j)
{
if(i == j)
{
G->arc[i][j] = 0;
}
else
{
G->arc[i][j] = INFINITY;
}
}
}
for(k = 0;k < G->numEdges;++k)
{
printf("请输入边(vi,vj)上的下标i,下标j和权w:\n");
cin>>i>>j>>w;
G->arc[i][j] = G->arc[j][i] = w;
}
}
void ShowMGraph(MGraph *G)
{
cout<<"图的顶点,边数为:"<<G->numVertexes<<","<<G->numEdges<<endl;
cout<<"邻接矩阵为:"<<endl;
for(int i = 0;i < G->numVertexes;++i)
{
for(int j = 0;j < G->numVertexes;++j)
{
if(G->arc[i][j] == INFINITY)
{
cout<<"# ";
}
else
{
cout<<" "<<G->arc[i][j]<<" ";
}
}
cout<<endl;
}
}
void MiniSpanTree_Prim(MGraph *G)
{
int i , j, min,k,sum;
int lowcost[MAXVEX];
int adjvex[MAXVEX];
sum = 0;
lowcost[0] = 0;
adjvex[0] = 0;
for(i = 1;i < G->numVertexes;++i)
{
lowcost[i] = G->arc[0][i];
adjvex[i] = 0;
}
for(i = 1;i < G->numVertexes;++i)
{
min = INFINITY;
j = 1;
k = 0;
while(j < G->numVertexes)
{
if(lowcost[j] < min && lowcost[j] != 0)
{
k = j;
min = lowcost[j];
}
j++;
}
printf("%d<-> %d,权值为%d\n",adjvex[k],k,G->arc[k][adjvex[k]]);
sum += G->arc[k][adjvex[k]];
lowcost[k] = 0;
for(j = 1;j < G->numVertexes;++j)
{
if(lowcost[j] != 0 && lowcost[j] > G->arc[k][j])
{
lowcost[j] = G->arc[k][j];
adjvex[j] = k;
}
}
}
printf("权值之和为:%d\n",sum);
}
int main()
{
MGraph *G = new MGraph();
CreateMGraph_Undirected(G);
ShowMGraph(G);
MiniSpanTree_Prim(G);
delete G;
}