Cod sursa(job #2517359)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 3 ianuarie 2020 13:55:43
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

struct muc{
	int a, b;
	int v;
	bool operator<(const muc &rhs){
		return v < rhs.v;
	}
};

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

int n, m, k;
vector<muc> gra;

int tre[15041], wei[15041], woe[15041];

void nuke(){
	for(int i = 1; i <= n; ++i){
		tre[i] = i;
		wei[i] = 1;
	}
}

int dad(int a){
	while(tre[a] != a){
		a = tre[a];
	}
	return a;
}

void we(int a, int b, int v){
	tre[a] = b;
	wei[b] += wei[a];
	woe[a] = v;
}

int unit(int a, int b, int v){
	a = dad(a);
	b = dad(b);
	if(wei[a] < wei[b]){
		we(a, b, v);
	}else{
		we(b, a, v);
	}
}

int teit(int a, int b){
	return dad(a)==dad(b);
}

void prepre(){
	nuke();
	sort(gra.begin(), gra.end());
	for(int i = 0; i < m; ++i){
		muc x = gra[i];
		if(!teit(x.a, x.b)){
			unit(x.a, x.b, x.v);
		}
	}
}

int supa(int a, int b){
	int maxi = 0;
	while(a != b){
		int x;
		if(wei[a] < wei[b]){
			x = woe[a];
			a = tre[a];
		}else{
			x = woe[b];
			b = tre[b];
		}
		maxi = max(maxi, x);
	}
	return maxi;
}

int main(){
	fin >> n >> m >> k;
	for(int i = 0; i < m; ++i){
		muc x;
		fin >> x.a >> x.b >> x.v;
		gra.push_back(x);
	}
	prepre();
	
	for(int i = 0; i < k; ++i){
		muc x;
		fin >> x.a >> x.b;
		fout << supa(x.a, x.b) << "\n";
	}
	return 0;
}