#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
const int VERTEX_NUM = 7;
const int INF = 0x7fffffff;
struct V_UArc {
int adjvex;
int lowcost; // V中的顶点的lowcost为0以作标记
}closedge[VERTEX_NUM + 1]; // 记录从顶点集U到V-U的代价最小的边的辅助数组定义
int Minimum(V_UArc closedge[VERTEX_NUM + 1])
{
// 选出连接V-U到U的具有最小权值的边
// 此时closedge[k].lowcost =
// MIN{ closedge[vi].lowcost | closedge[vi].lowcost>0, vi∈V-U }
int k = -1; // 初始化,虽然可能没用
for (int i = 1; i <= VERTEX_NUM; i++) { // 选出满足closedge[vi].lowcost>0, vi∈V-U的第一个
if (0 < closedge[i].lowcost && closedge[i].lowcost < INF) {
k = i;
break;
}
}
for (int i = k + 1; i <= VERTEX_NUM; i++) {
if (0 < closedge[i].lowcost && closedge[i].lowcost < INF) {
if (closedge[i].lowcost < closedge[k].lowcost) // 满足条件之后选小的
k = i;
}
}
return k;
}
void MiniSpanTree_PRIM(int G[VERTEX_NUM + 1][VERTEX_NUM + 1], int k) // k>=1
{
// 用普里姆算法从第k个顶点出发构造网G的最小生成树T,输出T的各条边
for (int j = 1; j <= VERTEX_NUM; ++j) { // 辅助数组初始化
if (j != k) {
closedge[j].adjvex = k;
closedge[j].lowcost = G[k][j];
}
}
// closedge[k].adjvex = k; // 此值不关心
closedge[k].lowcost = 0; // 初始,U={k}
for (int i = 0; i < VERTEX_NUM - 1; i++) { // 选择其余VERTEX_NUM-1个顶点
k = Minimum(closedge); // 求出T的下一个结点:第k顶点
cout << closedge[k].adjvex << "---" << k << endl;
closedge[k].lowcost = 0; // 第k顶点并入U集
for (int j = 1; j <= VERTEX_NUM; ++j) {
// 新顶点并入U后重新对V-U中的顶点选择最小边(U中的顶点lowcost==0)
if (G[k][j] < closedge[j].lowcost) {
closedge[j].adjvex = k;
closedge[j].lowcost = G[k][j];
}
}
}
}
void CreatAdjMatrixGraph(int G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
for (int i = 1; i <= VERTEX_NUM; i++) {
for (int j = 1; j <= VERTEX_NUM; j++)
G[i][j] = INF;
}
int a;
int b;
int w;
while ( cin >> a >> b >> w,
!(a == 0 && b == 0 && w == 0) ) { //以0 0 0作为输入结束
G[a][b] = w;
G[b][a] = w;
}
}
void Display(int G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
for (int i = 1; i <= VERTEX_NUM; i++) { // 输出邻接矩阵
for (int j = 1; j <= VERTEX_NUM; j++) {
if (G[i][j] == INF)
cout << "∞ ";
else
cout << G[i][j] << " "; // 不是' '
}
cout << endl;
}
}
int main(int argc, char **argv)
{
freopen("cin.txt", "r", stdin);
int G[VERTEX_NUM + 1][VERTEX_NUM + 1];
CreatAdjMatrixGraph(G);
Display(G);
int k = 3; // 从第k个顶点出发构造MST
MiniSpanTree_PRIM(G, k);
return 0;
}
/* cin.txt:
3 1 1
3 2 5
3 5 6
3 6 4
3 4 5
1 2 6
2 5 3
5 6 6
6 4 2
4 1 5
6 7 1
0 0 0
*/
