Cod sursa(job #1323358)

Utilizator retrogradLucian Bicsi retrograd Data 20 ianuarie 2015 22:52:20
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#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';
    }
}