Cod sursa(job #2736637)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 3 aprilie 2021 18:34:11
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("radiatie.in");
ofstream g("radiatie.out");
	
struct Edge{
	int u, v, wt;
	bool operator < (const Edge &e) const{
		return wt < e.wt;
	}
};
 
vector <Edge> edges;

int parent[15001], rnk[15001], rad[15001];
int N, M, K;

int find_set(int v){
	if(v == parent[v])
		return v;
	return parent[v] = find_set(parent[v]);
}
 
void union_sets(int a, int b, int cost){
	a = find_set(a);
	b = find_set(b);
	if(a != b){
		if(rnk[a] < rnk[b])
			swap(a, b);
		parent[b] = a;
		rad[b] = cost;
		if(rnk[a] == rnk[b])
			rnk[a]++;
	}
}

void Kruskal(){
	for(int i = 1;i <= N;i++)
		parent[i] = i, rnk[i] = 0;

	sort(edges.begin(), edges.end());
 
	for(Edge e : edges)
		if(find_set(e.u) != find_set(e.v))
			union_sets(e.u, e.v, e.wt);
}

int lca(int a, int b){

	int ans = -1;
	while(a != b){
		if(rnk[a] < rnk[b]){
			ans = max(ans, rad[a]);
			a = parent[a];
		}
		else{
			ans = max(ans, rad[b]);
			b = parent[b];
		}
	}

	return ans;
}

int main(){
	f >> N >> M >> K;
	while(M--){
		Edge E;
		f >> E.u >> E.v >> E.wt;
		edges.emplace_back(E);
	}

	Kruskal();

	while(K--){
		int a, b;
		f >> a >> b;
		g << lca(a, b) << "\n";
	}
}