hdu 1863(最小生成树kruskal)
生活随笔
收集整理的這篇文章主要介紹了
hdu 1863(最小生成树kruskal)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/*Name: hdu1863暢通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成樹(shù)(kruskal)
*/
#include <cstdio>
#include <iostream>using namespace std;const int M = 5050;int p[M], sum; //sum統(tǒng)計(jì)頂點(diǎn)個(gè)數(shù)
struct edge {int a;int b;int w;
}e[M];int cmp(const void *a, const void *b) {return (*(edge *)a).w - (*(edge *)b).w;
} void init(int vs) {for (int i=1; i<=vs; ++i) p[i] = i;return ;
}int find(int v) {if (p[v] != v) p[v] = find(p[v]);return p[v];
}int join(edge e) {int x, y;x = find(e.a);y = find(e.b);if (x != y) {++sum;p[x] = y;return e.w;}return 0;
}int kruskal(int es, int vs) {int ans = 0;init(vs);qsort(e, es, sizeof(edge), cmp);for (int i=0; i<es; ++i) {ans += join(e[i]);if (sum == vs) return ans;}if (sum < vs) return -1;
}int main() {int n, m;while (scanf("%d%d", &n, &m), n) {sum = 1;for (int i=0; i<n; ++i) scanf ("%d%d%d", &e[i].a, &e[i].b, &e[i].w);int ans = kruskal(n, m);if (ans == -1) printf ("?\n");else printf ("%d\n", ans);}return 0;
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/try86/archive/2012/04/10/2440366.html
總結(jié)
以上是生活随笔為你收集整理的hdu 1863(最小生成树kruskal)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: arguments.callee()事例
- 下一篇: 窗体的关闭事件