Cod sursa(job #229326)

Utilizator peanutzAndrei Homorodean peanutz Data 9 decembrie 2008 21:42:36
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#include <vector>
#include <string.h>
#include <algorithm>
#include <queue>

#define NMAX 15010
#define MMAX 30010
#define pb push_back
#define sz size()
#define ff first
#define ss second
#define MP make_pair

using namespace std;

int n, m, k;
pair<int, pair<int, int> > muc[MMAX];
vector< pair<int, int > > g[NMAX];

void read()
{
	int i, a, b, c;
	scanf("%d %d %d", &n, &m, &k);
	for(i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &a, &b, &c);
		muc[i] = MP(c, MP(a, b));
	}
	sort(muc+1, muc+m+1);
}

int t[NMAX];

int father(int x)
{
	if(t[x] == x) return x;
	x = father(t[x]);
	return x;
}

int join(int a, int b)
{
	if(a&1)
		t[a] = b;
	else
		t[b] = a;
}

void apm()
{
	for(int i = 1; i <= n; ++i) t[i] = i;
	int nr = 0, a, b;
	for(int i = 1; i <= m; ++i)
	{
		a = father(muc[i].ss.ff);
		b = father(muc[i].ss.ss);
		if(a == b) continue;
		
		//printf("%d %d %d\n", muc[i].ss.ff, muc[i].ss.ss, muc[i].ff);
		g[a].pb( MP(b, muc[i].ff) );
		g[b].pb( MP(a, muc[i].ff) );
		
		join(a, b);
		++nr;
		if(nr == n-1) break;
	}
}

inline int MAX(int a, int b)
{
	if(a > b) return a;
	return b;
}

short uz[NMAX];

int bf(int a, int b)
{
	queue< pair<int, int> > q;
	vector< pair<int, int> > :: iterator it;
	q.push( MP(a, 0) );
	memset(uz, 0, sizeof(uz));
	uz[a] = 1;
	int c, x;
	while(!q.empty())
	{
		x = (q.front()).ff;
		c = (q.front()).ss;
		q.pop();
		for(it = g[x].begin(); it != g[x].end(); ++it)
		{
			if(!uz[ (*it).ff ])
			{
				c = MAX(c, (*it).ss);
				q.push( MP((*it).ff, c) );
				
				if((*it).ff == b)
					return c;
				++uz[ (*it).ff ];
			}
		}
	}
	return 0;
}
		
int main()
{
	freopen("radiatie.in", "r", stdin);
	freopen("radiatie.out", "w", stdout);
	
	read();

	apm();
	
	int a, b;
	for(int i = 1; i <= k; ++i)
	{
		scanf("%d %d", &a, &b);
		printf("%d\n", bf(a, b));
	}	
	
	return 0;
}