Cod sursa(job #257590)

Utilizator scvalexAlexandru Scvortov scvalex Data 13 februarie 2009 17:14:13
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

typedef struct {
	int u, v, w;
} Muchie;

int N, M, K;
Muchie m[30000];
int P[15001], D[15001];
int L[15001];
int mrkd[15001];

bool lt(const Muchie &a, const Muchie &b) {
	return (a.w < b.w);
}

int find_progenitor(int u) {
	for (; P[u] != u; u = P[u])
		;
	return u;
}

void mark_up(int u, int w) {
	mrkd[u] += w;
	if (u != P[u])
		mark_up(P[u], w);
}

int find_max(int u) {
	int m = 0;
	for (; mrkd[u] != 2; u = P[u])
		m = max(m, D[u]);
	return m;
}

void gen_apm() {
	int i, u, v;

	sort(m, m+M, lt);
	/*for (i = 0; i < M; ++i)
		printf("%d %d %d\n", m[i].u, m[i].v, m[i].w);*/
	
	for (i = 1; i <= N; ++i)
		P[i] = i;

	for (i = 0; i < M; ++i) { /* maybe stop after adding N-1 edges? */
		u = find_progenitor(m[i].u);
		v = find_progenitor(m[i].v);
		if (u != v) {
			if (L[u] > L[v]) {
				P[v] = u;
				D[v] = m[i].w;
			} else {
				P[u] = v;
				D[u] = m[i].w;
				if (L[u] == L[v])
					++L[v];
			}
		}
		
	}

}

int main(int argc, char *argv[]) {
	int i, x, y;

	FILE *fi = fopen("radiatie.in", "r");
	fscanf(fi, "%d %d %d", &N, &M, &K);
	for (i = 0; i < M; ++i)
		fscanf(fi, "%d %d %d", &m[i].u, &m[i].v, &m[i].w);

	gen_apm();

	FILE *fo = fopen("radiatie.out", "w");
	for (i = 0; i < K; ++i) {
		fscanf(fi, "%d %d", &x, &y);

		mark_up(x, 1);	
		mark_up(y, 1);
		fprintf(fo, "%d\n", max(find_max(x), find_max(y)));
		mark_up(x, -1);
		mark_up(y, -1);
	}
	fclose(fo);
	fclose(fi);

	return 0;
}