输入:顶点个数n和边数m,然后是m条边的数据。u v w 分别代表两个顶点和权值。顶点从1开始记起。
输出:一次选择的各条边和最小生成树的权。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cctype> 6 #include <stack> 7 #include <queue> 8 #include <map> 9 #include <set> 10 #include <vector> 11 #include <cmath> 12 #include <algorithm> 13 #define lson l, m, rt<<1 14 #define rson m+1, r, rt<<1|1 15 using namespace std; 16 typedef long long int LL; 17 const int MAXN = 0x3f3f3f3f; 18 const int MIN = -0x3f3f3f3f; 19 const double eps = 1e-9; 20 const int dir[8][2] = {{0,1},{1,0},{0,-1},{-1,0},{-1,1}, 21 {1,1},{1,-1},{-1,-1}}; 22 const int MAX = 100; 23 int n, m, lowcost[MAX], nearvex[MAX], edge[MAX][MAX]; 24 void prim(int u0) 25 { 26 int i, j, sum = 0; 27 for (i = 1; i <= n; ++i) { 28 lowcost[i] = edge[u0][i]; nearvex[i] = u0; 29 } 30 nearvex[u0] = -1; 31 for (i = 1; i < n; ++i) { 32 int min = MAXN, v = -1; 33 for (j = 1; j <= n; ++j) { 34 if (nearvex[j] != -1 && lowcost[j] < min) { 35 min = lowcost[j]; v = j; 36 } 37 } 38 if (v != -1) { 39 printf("%d %d %d\n", nearvex[v], v, lowcost[v]); 40 sum += lowcost[v]; 41 nearvex[v] = -1; 42 for (j = 1; j <= n; ++j) { 43 if (nearvex[j] != -1 && lowcost[j] > edge[v][j]) { 44 lowcost[j] = edge[v][j]; nearvex[j] = v; 45 } 46 } 47 } 48 } 49 printf("MST sum is : %d\n", sum); 50 } 51 52 int main(void){ 53 #ifndef ONLINE_JUDGE 54 freopen("prim.in", "r", stdin); 55 #endif 56 while (~scanf("%d%d", &n, &m)) { 57 int i, j, u, v, w; 58 memset(edge, 0, sizeof(edge)); 59 for (i = 1; i <= m; ++i) { 60 scanf("%d%d%d", &u, &v, &w); 61 edge[u][v] = edge[v][u] = w; 62 } 63 for (i = 1; i <= n; ++i) { 64 for (j = 1; j <= n; ++j) { 65 if (i == j) edge[i][j] = 0; 66 else if (edge[i][j] == 0) edge[i][j] = MAXN; 67 } 68 } 69 prim(1); 70 } 71 72 return 0; 73 }
写代码的时候,还是会出现各种错误,比如for循环里面到底是不是要取到等号,一定要想清楚,还有就是细节,输入的m和n不要搞错了。