Cod sursa(job #1614681)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 26 februarie 2016 01:14:32
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>
#include <algorithm>
#include <vector>

#define DIM 15010
#define x first
#define y second.first
#define cost second.second

using namespace std;

ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

int n, m, queriesCount;
int parent[DIM], lenght[DIM], level[DIM];

pair<int, pair<int, int> > edges[2 * DIM];

vector<int> apm[DIM];

bool cmp(const pair<int, pair<int, int> > &a, const pair<int, pair<int, int> > &b) {

	return a.cost < b.cost;

}

int root(int node) {

	while (parent[node] > 0)
		node = parent[node];

	return node;

}

void DFS(int node, int lvl)
{
	level[node] = lvl;

	for (int i = 0; i < apm[node].size(); i++) {
	
		int child = apm[node][i];
		DFS(child, lvl + 1);
	
	}

}

int main() {

	fin >> n >> m >> queriesCount;

	for (int i = 1; i <= m; i++)
		fin >> edges[i].x >> edges[i].y >> edges[i].cost;

	sort(edges + 1, edges + m + 1, cmp);

	for (int i = 1; i <= n; i++)
		parent[i] = -1;

	int rootAPM = 1;

	for (int i = 1; i <= m; i++) {
		
		int rootx = root(edges[i].x);
		int rooty = root(edges[i].y);
		
		if (rootx == rooty)
			continue;

		if (parent[rootx] <= parent[rooty]) {
	
			parent[rootx] += parent[rooty];
			parent[rooty] = rootx;

			lenght[rooty] = edges[i].cost;
			apm[rootx].push_back(rooty);
			
			rootAPM = rootx;

		}
		else {
		
			parent[rooty] += parent[rootx];
			parent[rootx] = rooty;

			lenght[rootx] = edges[i].cost;
			apm[rooty].push_back(rootx);
			
			rootAPM = rooty;

		}
		
	}

	DFS(rootAPM, 1);

	while (queriesCount--) {

		int node1, node2;
		fin >> node1 >> node2;

		int solution = 0;

		while (level[node1] > level[node2]) {
			
			solution = max(solution, lenght[node1]);

			node1 = parent[node1];
	
		}
		while (level[node1] < level[node2]) {

			solution = max(solution, lenght[node2]);

			node2 = parent[node2];

		}

		while (node1 != node2) {
			
			solution = max(solution, lenght[node1]);
			solution = max(solution, lenght[node2]);

			node1 = parent[node1];
			node2 = parent[node2];
		
		}

		fout << solution << "\n";

	}

	return 0;

}

//Miriam e tare!