Cod sursa(job #503573)

Utilizator skullLepadat Mihai-Alexandru skull Data 23 noiembrie 2010 19:42:37
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define punct pair<int,int>
#define nod first
#define cos second
#define nmax 15005
#define mmax 30005

int n, m, t, maxim;
int X[mmax], Y[mmax], C[mmax], ind[mmax], GR[nmax], viz[nmax], cost[nmax];
vector<punct> G[nmax];

struct cmp
{
	bool operator () (const int &a, const int &b) const
	{
		return C[a] < C[b];
	}
};

void citire ()
{
	freopen("radiatie.in","r",stdin);
	scanf("%d %d %d ", &n, &m, &t);
	for (int i = 1; i <= m; ++i)
	{
		scanf("%d %d %d ", &X[i], &Y[i], &C[i]);
		ind[i] = i; GR[i] = i;
	}
}

int grupa (int x)
{
	if (GR[x] == x) return x;
	GR[x] = grupa(GR[x]);
	return GR[x];
}

void unire (int x, int y, int c)
{
	GR[grupa(x)] = grupa(y);
	G[x].push_back( make_pair(y,c));
	G[y].push_back( make_pair(x,c));
}

void kruskal ()
{
	sort(ind+1, ind+m+1, cmp() );
	for (int i = 1; i <= m; ++i)
		if ( grupa( X[ind[i]] ) != grupa( Y[ind[i]] ) )
			unire( X[ind[i]], Y[ind[i]], C[ind[i]]);
}

int parcurgere (int x, int y)
{
	int i, top;
	punct z;
	queue<int> Q;
	for (i = 1; i <= n; ++i) { viz[i] = 0; cost[i] = 0; }
	viz[x] = 1;
	Q.push(x);
	while ( !Q.empty() )
	{
		top = Q.front(); Q.pop ();
		for (i = 0; i < G[top].size(); ++i)
		{
			z = G[top][i];
			if ( !viz[z.nod] )
			{
				cost[z.nod] = max(cost[top], z.cos);
				if (z.nod == y) return cost[z.nod];
				viz[z.nod] = 1;
				Q.push(z.nod);
			}
		}
	}
	return 0;
}

void drumuri ()
{
	freopen("radiatie.out","w",stdout);
	int i, x, y;
	for (i = 1; i <= t; ++i)
	{
		scanf("%d %d ", &x, &y);
		maxim = parcurgere(x, y);
		printf("%d\n", maxim);
	}
}
	
int main ()
{
	citire ();
	kruskal ();
	drumuri ();
	return 0;
}