诶,,,要是以前养成了那么好的习惯就好了,,,现在再改是不是就有点晚了呢???
我才不相信会晚呢,,,还有很长时间呢,,够我吧这个习惯给改掉了 呼呼
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <algorithm> #define inf 0x3fffffff using namespace std; int N; int map[111][111]; int visit[111]; int dis[111]; int prim() { for (int i = 1; i <= N; i++) { dis[i] = inf; } dis[1] = 0; for (int i = 1; i <= N; i++) { int t = inf, pos; for (int j = 1; j <= N; j++) { if (!visit[j] && t > dis[j]) { t = dis[j]; pos = j; } } visit[pos] = 1; for (int j = 1; j <= N; j++) { if (!visit[j] && dis[j] > map[pos][j] && map[pos][j] != 0x3f3f3f3f) { dis[j] = map[pos][j]; } } } int sum = 0; for (int i = 1; i <= N; i++) { // cout << dis[i] << endl; sum += dis[i]; } return sum; } int main() { while (scanf ("%d" , &N), N) { memset (visit, 0 , sizeof (visit)); memset (map, 0x3f , sizeof(map)); int M = N * (N-1) / 2; int a, b, val; for (int i = 1; i <= M; i++) { scanf ("%d %d %d", &a, &b ,&val); if (map[a][b] > val) { map[a][b] = val; map[b][a] = val; } } int ans = prim(); printf ("%d\n", ans); } return 0; }
再来一个标准排版的krusacal()算法:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std; int N;//N represents the number of points; int M;// M represents the number of edges; int set[111]; struct Edge{ int a; int b; int val; }e[22222]; bool cmp(Edge a, Edge b) { return a.val < b.val; } int find(int x) { return set[x] = (x == set[x]? x : find(set[x]));//这个也是需要记忆加理解的 } int kruscal() { for (int i = 1; i <= N; i++) { set[i] = i; } int sum = 0; for (int i = 1; i <= M; i++)//这一点是需要注意的,可不是小于点的个数,而是小于等于边的个数 { int x = find(e[i].a); int y = find(e[i].b); int val = e[i].val; if (x != y) { // cout << x << " " << y << endl; // cout << val << endl; set[x] = y; sum += val; } } return sum; } int main() { while (scanf ("%d", &N), N) { int a, b, val; M = N * (N-1) / 2; for (int i = 1; i <= M; i++) { scanf ("%d %d %d", &e[i].a, &e[i].b, &e[i].val);//为什么不需要处理重边的呢? } sort(e + 1, e + M + 1, cmp);//这也需要注意的,注意sort里面的参数都是地址 int ans = kruscal(); printf ("%d\n", ans); } return 0; }