Cod sursa(job #223247)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 27 noiembrie 2008 20:37:17
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define MAXN 150010

struct NOD {
	long i, j, c;
} a[30001];

long i, j, ti, tj, t, n, m, k, c[MAXN], d[MAXN], viz[MAXN], max[MAXN];

int cmp(const void *a, const void *b) {
	return (((NOD*)a)->c - ((NOD*)b)->c);
}

long GAS(long);

int main() {
	freopen("radiatie.in", "r", stdin);
	freopen("radiatie.out", "w", stdout);
	scanf("%ld %ld %ld", &n, &m, &k);
	for (t = 0; t < m; ++t) {
		scanf("%ld %ld %ld", &a[t].i, &a[t].j, &a[t].c);
	}
	qsort(a, m, sizeof(NOD), cmp);
	for (i = 1, j = -1; i < n; ++i) {
		for (ti = tj; ti == tj; ++j, ti = GAS(a[j].i), tj = GAS(a[j].j));
		c[tj] = ti;
		d[tj] = a[j].c;
	}
	for (t = 1;t <= k; ++t) {
		scanf("%ld %ld", &i, &j);
		viz[i] = t;
		max[i] = 0;
		while(c[i]) {
			if (d[i] > max[i]) {
				max[c[i]] = d[i];
			} else {
				max[c[i]] = max[i];
			}
			i = c[i]; 
			viz[i] = t;
		}
		if (j != i) {
			if (viz[j] == t) {
				printf("%ld\n", max[j]);
			} else {
				max[j] = 0;
				while (viz[c[j]] != t) {
					if (d[j] > max[j]) {
						max[c[j]] = d[j];
					} else {
						max[c[j]] = max[j];
					}
					j = c[j];
				}
				if (d[j] > max[j]) {
					max[j] = d[j];
				}
				if (max[c[j]] > max[j]) {
				   printf("%ld\n", max[c[j]]);
				} else {
				   printf("%ld\n", max[j]);
				}
			}
		} else {
			printf("%ld\n",max[i]);
		}
	}
	return 0;
 }

long GAS(long k) {
	while (c[k]) {
		k = c[k];
	}
	return k;
}