Pagini recente » Cod sursa (job #285317) | Cod sursa (job #2878327) | Cod sursa (job #2441433) | Cod sursa (job #3005171) | Cod sursa (job #1323358)
#include<fstream>
#include<algorithm>
#include<vector>
#define MAXM 30000
#define MAXN 15000
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
typedef int var;
struct Edge {
var a, b, c;
Edge(var x, var y, var z) {
a = x; b = y; c = z;
}
};
vector<Edge> EDGES;
var n, m;
var ind;
bool cmp(const Edge &a, const Edge &b) {
return a.c < b.c;
}
var RANKP[MAXN], LEADER[MAXN], PARENT[3*MAXN], VAL[3*MAXN], NODE[MAXN], RANK[3*MAXN];
var Union(var r1, var r2, var node) {
if(RANKP[r1] < RANKP[r2]) {
LEADER[r1] = r2;
NODE[r2] = node;
return r2;
}
else {
LEADER[r2] = r1;
NODE[r1] = node;
if(RANKP[r2] == RANKP[r1])
RANKP[r1] ++;
return r1;
}
}
var Find(var v) {
while(LEADER[v]) v = LEADER[v];
return v;
}
var getRank(int i) {
if(ind == i || RANK[i]) return RANK[i];
RANK[i] = getRank(PARENT[i]) + 1;
return RANK[i];
}
var lca(var a, var b) {
var r1 = getRank(a);
var r2 = getRank(b);
while(r1 < r2) {
b = PARENT[b];
r2 --;
}
while(r2 < r1) {
a = PARENT[a];
r1 --;
}
while(a != b) {
a = PARENT[a];
b = PARENT[b];
}
return a;
}
int main() {
var k, a, b, c;
fin>>n>>m>>k;
for(var i=1; i<=n; i++) {
NODE[i] = i;
}
ind = n;
for(var i=1; i<=m; i++) {
fin>>a>>b>>c;
EDGES.push_back(Edge(a, b, c));
}
//Le sortam
sort(EDGES.begin(), EDGES.end(), cmp);
//
for(var i=0; i<EDGES.size(); i++) {
Edge &e = EDGES[i];
var r1 = Find(e.a);
var r2 = Find(e.b);
if(r1 != r2) {
PARENT[NODE[r1]] = PARENT[NODE[r2]] = ++ind;
Union(r1, r2, ind);
VAL[ind] = e.c;
}
}
while(k--) {
fin>>a>>b;
fout<<VAL[lca(a, b)]<<'\n';
}
}