#include<iostream>
using namespace std;
const int MAXSIZE = 10;
class MGraph
{
public:
MGraph();
int vNum, arcNum;int arcs[MAXSIZE][MAXSIZE];
private:
string vertex[MAXSIZE];
};
MGraph::MGraph()
{
cin >> vNum;
cin >> arcNum;
for (int i = 0; i < vNum; i++)
{
for (int j = 0; j < vNum; j++)
{
cin >> arcs[i][j];
}
}
}
class Prim
{
private:
int adjvex[MAXSIZE];
int lowcost[MAXSIZE];
public:
Prim(MGraph G);
int minimum(MGraph G, int lowcost[]);
int GetMax(MGraph G);
void Traverse(MGraph G);
};
void Prim::Traverse(MGraph G)
{
for (int i = 0; i < G.vNum; i++)
{
std::cout << adjvex[i] << ' ';
}
}
int Prim::GetMax(MGraph G)
{
int k = 0;
for (int i = 0; i < G.vNum; i++)
{
for (int j = 0; j < G.vNum; j++)
{
if (k < G.arcs[i][j])
{
k = G.arcs[i][j];
}
}
}
return k;
}
int Prim::minimum(MGraph G, int lowcost[])
{
int min = GetMax(G);
int k = 0;
for (int i = 1; i < G.vNum; i++)
{
if (lowcost[i] != 0 && lowcost[i] < min)
{
min = lowcost[i];
k = i;
}
}
return k;
}
Prim::Prim(MGraph G)
{
for (int i = 0; i < G.vNum; i++)
{
adjvex[i] = 0; lowcost[i] = G.arcs[0][i];//lowcost存储针对每个顶点的所有弧的邻接矩阵的某一列数据的首个
}
lowcost[0] = 0;//初始化V0的lowcost值为0表示已经遍历
for (int i = 1; i < G.vNum; i++)
{
int k = minimum(G, lowcost);//minimum函数的作用是取得当前所有可连得新节点边中权值最小的节点
std::cout << 'V' << adjvex[k] << "->V" << k << std::endl;
lowcost[k] = 0;//表示该节点已经被遍历
for (int j = 0; j < G.vNum; j++)
{
if (lowcost[j] != 0 && G.arcs[k][j] < lowcost[j])
{
lowcost[j] = G.arcs[k][j];//如果新加入的点针对某个其他节点的权值更小,则替换
adjvex[j] = k;//记录用的是谁的遍历
}
}
}
}
int main()
{
MGraph G;
Prim a(G);
}