Cod sursa(job #1162387)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 31 martie 2014 19:45:23
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");

struct elem {int x;int y;int cost;}Muc[30010];
int N,M,K;
int Tata[15010],Cost[15010],Nivel[15010];
int a,b;
vector <int> Muchie[15010];


bool cmp(elem A,elem B) {
    return (A.cost<B.cost);
}

void citired() {

    int i;
    in>>N>>M>>K;
    for(i=1;i<=M;i++)
        in>>Muc[i].x>>Muc[i].y>> Muc[i].cost;

}

bool dif_lant(){


    if(a!=b)
        return 1;
    return 0;

}


void arbore_part() {

    int i;
    sort(Muc+1,Muc+M+1,cmp);
    for(i=1;i<=M;i++) {
        a=Muc[i].x;
        while(Tata[a])
            a=Tata[a];
        b=Muc[i].y;
        while(Tata[b])
            b=Tata[b];
        if(a!=b){
            Tata[a]=b;
            Muchie[b].push_back(a);
            Cost[a]=Muc[i].cost;
        }
    }

}

void Dfs(int nod) {

    int i,vecin;
    for(i=0;i<Muchie[nod].size();i++) {
        vecin=Muchie[nod][i];
        Nivel[vecin]=Nivel[nod]+1;
        Dfs(vecin);
    }
}

void solve() {

    int i,maxim,rad,x,y;
    arbore_part();
    for(i=1;i<=N;i++)
        if(!Tata[i]){
            rad=i;
            break;
        }
    Dfs(rad);
    for(i=1;i<=K;i++) {
        in>>x>>y;
        maxim=-1;

        if(Nivel[x]<Nivel[y])
            swap(x,y);

        while(Nivel[x]>Nivel[y]) {
            maxim=max(maxim,Cost[x]);
            x=Tata[x];
        }
        while(x!=y) {
            maxim=max(maxim,max(Cost[x],Cost[y]));
            x=Tata[x];
            y=Tata[y];
        }
        out<<maxim<<'\n';
    }
    in.close();
    out.close();

}

int main() {

    citired();
    solve();
    return 0;

}