Saturday, May 16, 2015

UVa 11857 - Driving Range

// UVa 11857 - Driving Range

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

struct edge {
	int a, b, c;
};

bool operator <(edge x, edge y) {
	return x.c < y.c;
}

int C[1000000];

int find(int x) {
	return (C[x] == x) ? x : C[x] = find(C[x]);
}

void join(int x, int y) {
	int px = find(x);
	int py = find(y);
	C[py] = px;
}

vector<edge> lnk;

int main() {
	while (true) {
		int n, m;
		scanf("%d%d", &n, &m);
		if (n == 0 && m == 0)
			break;
		lnk.clear();
		for (int i = 0; i < m; i++) {
			int a, b, c;
			scanf("%d%d%d", &a, &b, &c);
			if (a > b) {
				int tmp = a;
				a = b;
				b = tmp;
			}
			lnk.push_back( { a, b, c });
		}
		sort(lnk.begin(), lnk.end());
		for (int i = 0; i < n; i++)
			C[i] = i;
		int sol = -1, count = 1;
		for (int j = 0; j < m; j++) {
			int a = lnk[j].a;
			int b = lnk[j].b;
			int c = lnk[j].c;
			if (find(a) != find(b)) {
				count++;
				if (count == n) {
					sol = c;
					break;
				}
				join(a, b);
			}
		}
		if (sol == -1)
			printf("IMPOSSIBLE\n");
		else
			printf("%d\n", sol);
	}
	return 0;
}

No comments:

Post a Comment