依然是:MST, kruskal,并查集,路径压缩;
在LD下的CB中老是提示segmentation fault,不知什么错误,回到win运行一闪而过而没有输出,查了半天发现查函数有一处错误,继续,仍然无输出,怀疑变量命名错误,更改,仍然无输出,最后发现文件保存的路径和输入文件的路径不一致,怎么样,流水账记得不错吧?
500MS,看了排行榜上没有0MS的,明白这道题500MS不算浪费时间。
# include <stdio.h> # include <stdlib.h> typedef struct { int u, v; int w; }Road; int m, n, p[105]; Road r[5005]; int kruskal(int n); int cmp(const void*x, const void*y){ return (*(Road*)x).w>(*(Road*)y).w ? 1:-1;} int find(int x){ return x==p[x] ? x:(p[x]=find(p[x]));} /*错误:p[x]=find(x); */ int main() { int i, j, x, y; int tu, tv, tw, tf; while (1) { scanf("%d", &m); if (!m) break; n = m*(m-1)/2; for (i = 1; i <= m; ++i) p[i] = i; for (j = 0, i = 1; i <= n; ++i) { scanf("%d%d%d%d", &tu, &tv, &tw, &tf); if (!tf) /*只记录没有在修的路*/ { ++j; r[j].u = tu, r[j].v = tv; r[j].w = tw; } else { x = find(tu); y = find(tv); if (x != y) p[x] = y; } } printf("%d\n", kruskal(j)); } return 0; } int kruskal(int n) { int i, cost, x, y; qsort(r+1, n, sizeof(r[0]), cmp); cost = 0; for (i = 1; i <= n; ++i) { x = find(r[i].u); y = find(r[i].v); if (x != y) { cost += r[i].w; p[x] = y; } } return cost; }