Cod sursa(job #7413)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 21 ianuarie 2007 15:16:03
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

#define PB push_back

struct muchie { int u, v, c; };
struct nod { int u, c; };

bool operator<(const muchie &a, const muchie &b) {
	return a.c < b.c;
}

const int MMAX = 32768;
const int NMAX = 16384;

int N, M, K, H;
muchie A[MMAX];
vector <nod> G[NMAX];
bool V[NMAX];
int T[NMAX], T2[NMAX], LEV[NMAX];
int R[NMAX], R2[NMAX];

int parinte(int T[], int u) {
	if (T[u] != u)
		T[u] = parinte(T, T[u]);
	return T[u];
}

void unite(int T[], int GR[], int u, int v, int c) {
	int tu, tv;
	nod aux;

	tu = parinte(T, u);
	tv = parinte(T, v);

	if (tu != tv) {

		if (GR[tu] > GR[tv])
			T[tv] = tu;
		else
			T[tu] = tv;

		if (GR[tu] == GR[tv]) ++GR[tu];

		aux.c = c;

		aux.u = v;
		G[u].PB(aux);

		aux.u = u;
		G[v].PB(aux);
	}
}

void kruskal() {
	int i;
	int T[NMAX], GR[NMAX];
	
	sort(A, A + M);

	for (i = 1; i <= N; ++i)
		T[i] = i, GR[i] = 0;

	for (i = 0; i < M; ++i)
		unite(T, GR, A[i].u, A[i].v, A[i].c);
}

int getheight(int k) {
	unsigned i;
	int H = 1;
	V[k] = true;

	for (i = 0; i < G[k].size(); ++i)
		if (V[ G[k][i].u ] == false)
			H = max(H, 1 + getheight(G[k][i].u));
	
	return H;
}

void DFS(int k, int t2, int lev, int rad) {
	unsigned i;
	int v;

	T2[k] = t2; LEV[k] = lev; R2[k] = rad;
//	printf("%d t=%d t2=%d lev=%d r=%d r2=%d\n", k, T[k], T2[k], lev, R[k], R2[k]);
	if (lev % H == 0) t2 = k, rad = 0;

	for (i = 0; i < G[k].size(); ++i) {
		v = G[k][i].u;

		if (T[v] == -1)
			T[v] = k, R[v] = G[k][i].c,
			DFS(v, t2, lev + 1, max(rad, G[k][i].c));
	}
}

int LCA(int u, int v) {
	int r = 0;

	while (T2[u] != T2[v])
		if (LEV[u] > LEV[v])
			r >?= R2[u], u = T2[u];
		else
			r >?= R2[v], v = T2[v];
	
	while (u != v)
		if (LEV[u] > LEV[v])	
			r >?= R[u], u = T[u];
		else
			r >?= R[v], v = T[v];

	return r;
}

int main() {
	FILE *fin = fopen("radiatie.in", "rt");
	FILE *fout = fopen("radiatie.out", "wt");
	int i, u, v;

	fscanf(fin, " %d %d %d", &N, &M, &K);

	for (i = 0; i < M; ++i)
		fscanf(fin, " %d %d %d", &A[i].u, &A[i].v, &A[i].c);

	kruskal();

	for (i = 1; i <= N; ++i)
		if (V[i] == false)
			H = max(H, getheight(i));

	H = (int) sqrt( (double) H );

	for (i = 1; i <= N; ++i)
		T[i] = -1;

	for (i = 1; i <= N; ++i)
		if (T[i] == -1)
			T[i] = 0,
			DFS(i, 0, 0, 0);

	for (i = 0; i < K; ++i) {
		fscanf(fin, " %d %d", &u, &v);

		fprintf(fout, "%d\n", LCA(u, v));
	}

	fclose(fin);
	fclose(fout);
	return 0;
}