Cod sursa(job #2099598)

Utilizator flibiaVisanu Cristian flibia Data 4 ianuarie 2018 15:27:59
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>
#define N 15100

using namespace std;

ifstream in("radiatie.in");
ofstream out("radiatie2.out");

struct edge{
	int x, y, c;
};

int n, m, k, x, y, xx, yy, c, vf, rs, stk[N], cost[N], dist[N], dad[N], anc[N][15], bst[N][15];
edge edges[2 * N];
vector <pair <int, int> > v[N];
bool viz[N];

bool cmp(edge a, edge b){
	return a.c < b.c;
}

int find(int x){
	return (dad[x] == x ? x : dad[x] = find(dad[x]));
}

void join(int x, int y){
	dad[find(x)] = find(y);
}

void dfs(int tata, int nod, int lvl, int cst){
	viz[nod] = 1;
	dist[nod] = lvl;
	cost[nod] = cst;
	dad[nod] = tata;
	for(auto son : v[nod])
		if(!viz[son.first])
			dfs(nod, son.first, lvl + 1, son.second);
}

void build(){
	int sz = log2(n);
	for(int i = 1; i <= n; i++)
		anc[i][0] = i;
	for(int j = 1; j <= sz; j++)
		for(int i = 1; i <= n; i++){
			x = anc[i][j - 1];
			anc[i][j] = anc[dad[x]][j - 1];
			bst[i][j] = max({bst[i][j - 1], bst[dad[x]][j - 1], cost[x]}); 
		}
}

void solve(){
	in >> x >> y;
	rs = 0;
	if(dist[x] < dist[y])
		swap(x, y);
	while(dist[x] > dist[y]){
		int j = 1;
		while(dist[anc[x][j]] >= dist[y]){
			rs = max(rs, bst[x][j]); 
			x = anc[x][j], j++;
		}
	}
	while(x != y){
		int j = 1;
		while(x != y && anc[x][j] != anc[y][j]){
			rs = max({rs, bst[x][j], bst[y][j]}); 
			x = anc[x][j]; 
			y = anc[y][j]; 
			j++;
		}
		if(x != y){
			rs = max({rs, bst[x][1], bst[y][1]});
			x = dad[x];
			y = dad[y];
		}
	}
	out << rs << '\n';
}

int main(){
	in >> n >> m >> k;
	for(int i = 1; i <= m; i++){
		in >> x >> y >> c;
		edges[i] = {x, y, c};
	}
	sort(edges + 1, edges + m + 1, cmp);
	for(int i = 1; i <= n; i++)
		dad[i] = i;
	for(int i = 1; i <= m; i++){
		x = edges[i].x;
		y = edges[i].y;
		c = edges[i].c;
		xx = find(x);
		yy = find(y);
		if(xx != yy){
			join(xx, yy);
			v[x].push_back({y, c});
			v[y].push_back({x, c});
		}
	}
	for(int i = 1; i <= n; i++)
		dad[i] = find(dad[i]);
	for(int i = 1; i <= n; i++)
		if(!viz[dad[i]]){
			viz[dad[i]] = 1;
			stk[++vf] = i;
		}
	memset(viz, 0, sizeof viz);
	for(int i = 1; i < vf; i++){
		v[i].push_back({i + 1, 0});
		v[i + 1].push_back({i, 0});
	}	
	vf = 0;
	dfs(0, 1, 1, 0);
	build();
	while(k--)
		solve();
	return 0;
}