#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 */