Cod sursa(job #911176)

Utilizator ELHoriaHoria Cretescu ELHoria Data 11 martie 2013 13:17:38
Problema Radiatie Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define pii pair<int,int>
#define x first
#define y second
#define mp make_pair

using namespace std;

ifstream cin("radiatie.in");
ofstream cout("radiatie.out");

const int NMAX = 15002;
int N, M, K;
vector< pii > G[NMAX], Q[NMAX];
int bst[NMAX], r[NMAX];
bool inQ[NMAX];

void readData() {
	cin>>N>>M>>K;
	int a, b, c;
	for(int i = 0;i < M;i++) {
		cin>>a>>b>>c;
		G[a].push_back(mp(b,c));
		G[b].push_back(mp(a,c));
	}
}

void bf(int src) {
	queue<int> q;
	memset(bst,-1,sizeof(bst));
	bst[src] = 0;
	q.push(src);
	inQ[src] = true;
	while(!q.empty()) {
		int v = q.front();
		q.pop();
		inQ[v] = false;
		for(vector< pii >::const_iterator w = G[v].begin();w != G[v].end();w++) {
			int cost = max(bst[v],w->y);
			if(bst[w->x] == -1 || cost < bst[w->x]) {
				bst[w->x] = cost;
				if(inQ[w->x] == false) {
					q.push(w->x);
					inQ[w->x] = true;
				}
			}
		}
	}
}

int main()
{
	readData();
	int a, b;
	for(int i = 0;i < K;i++) {
		cin>>a>>b;
		if(a > b) swap(a,b);
		Q[a].push_back(mp(b,i));
	}
	for(int i = 1;i <= N;i++) {
		if(!Q[i].empty()) {
			bf(i);
			for(vector< pii >::const_iterator it = Q[i].begin();it != Q[i].end();it++) {
				r[it->y] = bst[it->x];
			}
		}
	}
	for(int i = 0;i < K;i++) { 
		cout<<r[i]<<"\n";
	}
	return 0;
}