#include <stdio.h>
#include <stdlib.h>
#define max 100
typedef struct {
float key;
int u;
int v;
}EDGE;
void prim(float c[10][10], int n, EDGE T[], int& k) {
int i, j, u;
bool* s = new bool[n];
int* neig = new int[n];//近邻点
float min, * w = new float[n];
s[0] = true;
for (i = 1; i < n; i++) {//初始化集合N中各顶点的初始状态
w[i] = c[0][i];//顶点i与近邻关联边的权值
neig[i] = 0;//顶点i的近邻
s[i] = false;
}
k = 0;
for (i = 1; i < n; i++) {
u = 0;
min = max;
for(j=1;j<n;j++)
if (!s[j] && w[j] < min) {
u = j; min = w[j];
}
if (u == 0) break;
T[k].u = neig[u];
T[k].v = u;
T[k++].key = w[u];
s[u] = true;
for (j = 1; j < n; j++) {
if (!s[j] && c[u][j] < w[j]) {
w[j] = c[u][j];;
neig[j] = u;
}
}
}
delete s; delete w; delete neig;
}
int main() {
int k=0;
float c[10][10];
EDGE T[10];//边存放在T[];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
c[i][j] = max;
}
}
c[0][1] = c[1][0] = 4;
c[0][2] = c[2][0] = 2;
c[0][3] = c[3][0] = 3;
c[1][4] = c[4][1] = 10;
c[1][5] = c[5][1] = 9;
c[2][4] = c[4][2] = 6;
c[2][5] = c[5][2] = 7;
c[2][5] = c[6][2] = 10;
c[3][5] = c[5][3] = 3;
c[3][6] = c[6][3] = 8;
c[4][7] = c[7][4] = 4;
c[4][8] = c[8][4] = 8;
c[5][7] = c[7][5] = 9;
c[5][8] = c[8][5] = 6;
c[6][7] = c[7][6] = 5;
c[6][8] = c[8][6] = 4;
c[7][9] = c[9][7] = 8;
c[8][9] = c[9][8] = 4;
prim(c, 10, T, k);
for (int i = 0; i < 9; i++) {
printf("%d--%d\t%f", T[i].u, T[i].v, T[i].key);
printf("\n");
}
return 0;
}
11-23
390
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-12