Cod sursa(job #153894)

Utilizator anoukAnca Dumitrache anouk Data 10 martie 2008 19:50:36
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 30003
#define DIM 15005
using namespace std;

int N, M, K;
struct Muchie {
	int x, y, c;
};
Muchie m[MAX];
int S[DIM], H[DIM];
int X, Y, gasit, sel[DIM];
typedef struct Nod {
	int vf, c;
	Nod* next;
} NOD, *PNOD;
PNOD L[DIM];

void QSort(int st, int dr);
void MSP();
int Find(int x);
void Union(int x, int y);
void Add(int x, int y, int z);
void DF(int nod, int drum);

int main()
{
	FILE *fin = fopen("radiatie.in", "r");
	FILE *fout = fopen("radiatie.out", "w");
	
	fscanf(fin, "%d%d%d", &N, &M, &K);
	for (int i = 1; i <= M; i++)
		fscanf(fin, "%d%d%d", &m[i].x, &m[i].y, &m[i].c);
	
	QSort(1, M);
	MSP();
	
	for (int i = 1; i <= K; i++)
	{
		fscanf(fin, "%d%d", &X, &Y);
		memset(sel, 0, sizeof(sel));
		gasit = 0;
		DF(X, 0);
		fprintf(fout, "%d\n", gasit);
	}
	
	fclose(fin);
	fclose(fout);
	return 0;
}

void QSort(int st, int dr)
{
	int i = st, j = dr, pivot = m[(st + dr)/2].c;
	do
	{
		while (m[i].c < pivot) i++;
		while (m[j].c > pivot) j--;
		if (i <= j)
		{
			Muchie aux = m[i];
			m[i] = m[j];
			m[j] = aux;
			i++;
			j--;
		}
	} while (i <= j);
	if (i < dr) QSort(i,dr);
	if (j > st) QSort(st, j);
}

void MSP()
{
	for (int i = 1; i <= N; i++)
	{
		S[i] = i;
		H[i] = 1;
	}
	int k = 1, pas = N - 1;
	while (pas > 0 || k <= M)
	{
		int i = Find(m[k].x);
		int j = Find(m[k].y);
		if (i != j)
		{
			Union(i, j);
			Add(i, j, m[k].c);
			Add(j, i, m[k].c);
			pas--;
		}
		k++;
	}
}

int Find(int x)
{
	if (x == S[x]) return x;
	return S[x] = Find(S[x]);
}

void Union(int x, int y)
{
	if (H[x] < H[y])
		S[x] = S[y];
	else
	{
		S[y] = S[x];
		if (H[x] == H[y]) H[y]++;
	}
}

void Add(int x, int y, int z)
{
	PNOD p = new NOD;
	p->vf = y;
	p->c = z;
	p->next = L[x];
	L[x] = p;
}

void DF(int nod, int drum)
{
	if (gasit) return;
	int dnou = 0;
	sel[nod] = 1;
	for (PNOD p = L[nod]; p && !gasit; p = p->next)
		if (!sel[p->vf])
		{
			sel[p->vf] = 1;
			dnou = max(drum, p->c);
			if (p->vf == Y) gasit = dnou;
			else            DF(p->vf, dnou);
		}
}