#include <iostream>
using namespace std;

struct Mgraph{
   int vexnum;
   int arcnum;
   char *vertex;
   int **AdjMatrix;
  };
  
class Graph
{
 public:
  void CreateUDN();
  void DestroyUDN();
  void Minispantree_prim();
 private:   
  Mgraph gph;        //邻接矩阵存储
};

void Graph::CreateUDN()
{
 cout << "输入无向网的顶点数和边数:" << endl;
 cin >> gph.vexnum >> gph.arcnum;
 gph.vertex = (char *)malloc(gph.vexnum * sizeof(char));
 int i,j,m,n;                                   //m,n表示顶点信息对应的序号,w是权值
 int w;
 char v1,v2;
 cout << "输入顶点信息:" << endl;
 for(i = 0;i < gph.vexnum;i++)
  cin >> gph.vertex[i];
 gph.AdjMatrix = (int **)malloc(gph.vexnum * sizeof(int *));
 for(i = 0;i < gph.vexnum;i++)
  gph.AdjMatrix[i] = (int *)malloc(gph.vexnum * sizeof(int));
 for(i = 0;i < gph.vexnum;i++)
  for(j = 0;j < gph.vexnum;j++)
   gph.AdjMatrix[i][j] = INT_MAX;                   //INT_MAX
 cout << "输入一条边依附的两点及权值:" << endl;
 for(int k = 0;k < gph.arcnum;k++)
 {
  cin >> v1 >> v2 >> w;
  for(i = 0;i < gph.vexnum;i++)
  {
   if(v1 == gph.vertex[i]) m = i;
   if(v2 == gph.vertex[i]) n = i;
  }
  gph.AdjMatrix[m][n] = gph.AdjMatrix[n][m] = w;
 }


void Graph::DestroyUDN()
{
 free(gph.vertex);
 for(int i = 0;i < gph.vexnum;i++)
  free(gph.AdjMatrix[i]);
 free(gph.AdjMatrix);
}
 
void Graph::Minispantree_prim()
{
 struct closedge
 {
  int adjvex;
  int lowcost;
 };
 closedge *edge = (closedge *)malloc(gph.vexnum * sizeof(closedge));
 int i,j,k = 0,u;
 int min;
 for(i = 0;i < gph.vexnum;i++)
 {
  if(i != k)
  {
  edge[i].adjvex = 0;
  edge[i].lowcost = gph.AdjMatrix[k][i];
  }
 }
 edge[k].lowcost = 0;
 cout << "最小生成树的边如下:" << endl;
 for(i = 1;i < gph.vexnum;i++)
 {
  min = INT_MAX;
  for(j = 0;j < gph.vexnum;j++)
  if(edge[j].lowcost != INT_MAX &&edge[j].lowcost != 0 && edge[j].lowcost < min)
  {
   min = edge[j].lowcost;
   k = j;
  }
  u = edge[k].adjvex;
  edge[k].lowcost = 0;
  cout << "(" << gph.vertex[u] << "," << gph.vertex[k] << ")" << " ";
  for(j = 0;j < gph.vexnum;j++)
   if(gph.AdjMatrix[j][k] < edge[j].lowcost)
   {
    edge[j].lowcost = gph.AdjMatrix[j][k];
    edge[j].adjvex = k;
   }
 }
 free(edge);
 cout << endl;
}

int main()
{
 Graph gph;
 gph.CreateUDN();
 gph.Minispantree_prim();
  gph.DestroyUDN();
 return 0;
}