标签:
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
Kruskal算法(运用并查集思想): #include<stdio.h> #include<stdlib.h> #define N 20010 int f[N], n; struct node { int s, e, d; }no[N]; void Init() { int i; for (i = 0; i <= n; i++) f[i] = i; } int cmp(const void *a, const void *b) { node *s1 = (node *)a, *s2 = (node *)b; return s1->d - s2->d; } int Find(int x) { if (f[x] != x) f[x] = Find(f[x]); return f[x]; } int main () { int k, a, ans, i, j, ns, ne; while (scanf("%d", &n) != EOF) { ans = 0; k = 0; Init(); for (i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { scanf("%d", &a); no[k].s = i; no[k].e = j; no[k].d = a; k++; } } qsort(no, k, sizeof(no[0]), cmp); for (i = 0; i < k; i++) { ns = Find(no[i].s); ne = Find(no[i].e); if (ns != ne) { f[ns] = ne; ans += no[i].d; } } printf("%d\n", ans); } return 0; }
Prim算法: #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f #define N 110 int Map[N][N], dist[N], visit[N], n, ans; void Prim() { int i, j, Min, idex; memset(visit, 0, sizeof(visit)); visit[1] = 1; for (i = 1; i <= n; i++) dist[i] = Map[1][i]; for (i = 1; i < n; i++) { Min = INF; for (j = 1; j <= n; j++) { if (dist[j] < Min && !visit[j]) { Min = dist[j]; idex = j; } } visit[idex] = 1; ans += Min; //统计最小权值 for (j = 1; j <= n; j++) { if (!visit[j] && dist[j] > Map[idex][j]) dist[j] = Map[idex][j]; } } } int main () { int i, j; while (scanf("%d", &n) != EOF) { ans = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) scanf("%d", &Map[i][j]); } Prim(); //假设每次将结点1先加入最小生成树,直到n个结点全部加入 printf("%d\n", ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4675888.html