poj 2395

来源:互联网 发布:java作业汽车租赁系统 编辑:程序博客网 时间:2024/05/17 06:18

最小生成树Kruskal算法。

#include <iostream>#include <algorithm>using namespace std;const int MAXN = 1005;const int MAXM = 20005;int n, m, a, b, l;int cost[MAXN][MAXN];int par[MAXN];int rank[MAXN];struct edge {int x;int y;int cost;}es[MAXN];bool cmp(const edge& e1, const edge& e2) {return e1.cost < e2.cost;}void init(int n) {for(int i=0; i<n; i++) {par[i] = i;rank[i] = 0;}}int find(int x) {if(par[x] == x)return x;elsereturn par[x] = find(par[x]);}void unite(int x, int y) {x = find(x);y = find(y);if(x == y)return;if(rank[x] < rank[y])par[x] = y;else {par[y] = x;if(rank[x] == rank[y])rank[x]++;}}bool same(int x, int y) {return find(x) == find(y);}int main() {scanf("%d%d", &n, &m);int ids = 0;for(int i=0; i<m; i++) {scanf("%d%d%d", &a, &b, &l);es[ids].x = a;es[ids].y = b;es[ids++].cost = l;}sort(es, es+m, cmp);init(n);int res = 0;int max = -1;for(int i=0; i<m; i++) {edge e = es[i];if(!same(e.x, e.y)) {unite(e.x, e.y);max = max > e.cost ? max : e.cost;}}printf("%d\n", max);return 0;}


0 0