Cod sursa(job #1265523)

Utilizator serban.cobzacCobzac Serban serban.cobzac Data 17 noiembrie 2014 13:44:06
Problema Radiatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define mmax 30005
using namespace std;
FILE*fin=fopen("radiatie.in", "r");
FILE*fout=fopen("radiatie.out", "w");

struct muchie{
    int x, y, cost;
};
muchie gr[mmax];

int n, m, k, cnx[mmax];
int apm[mmax], lgApm;
int level[mmax], father[mmax], price[mmax];

struct vecin{
    int vf, cost;
};
vector <vecin> gPrim[mmax];

void citire();
void kruskal();
bool sortare(muchie, muchie);
void creare_gPrim();
void dfs(int nod, int parinte, int nivel, int cost);
int query(int, int);
void rez();

int main(){
    citire();
    kruskal();
    creare_gPrim();
    dfs(1, 0, 1, 0);
    rez();
    return 0;
}

void citire(){
    fscanf(fin, "%d%d%d", &n, &m, &k);
    for(int i=1; i<=m; ++i)
        fscanf(fin, "%d%d%d", &gr[i].x, &gr[i].y, &gr[i].cost);
}

void kruskal(){
    sort(gr+1, gr+m+1, sortare);
    int i, j, minim, maxim;
    for(i=1; i<=n; ++i) cnx[i]=i;
    for(i=1; i<=m && lgApm<n-1; ++i){
        if(cnx[gr[i].x]!=cnx[gr[i].y]){
            minim=cnx[gr[i].x];
            maxim=cnx[gr[i].y];
            if(maxim<minim){
                minim=cnx[gr[i].y];
                maxim=cnx[gr[i].x];
            }
            apm[++lgApm]=i;
            for(j=1; j<=n; ++j) if(cnx[j]==maxim) cnx[j]=minim;
        }
    }
}

bool sortare(muchie a, muchie b){
    return a.cost<b.cost;
}

void creare_gPrim(){
    int i, nodParinte, nodFiu, cost;
    vecin Vecin;
    for(i=1; i<=n-1; ++i){
        nodParinte=gr[apm[i]].x;
        nodFiu=gr[apm[i]].y;
        cost=gr[apm[i]].cost;

        Vecin.vf=nodFiu;
        Vecin.cost=cost;
        gPrim[nodParinte].push_back(Vecin);

        Vecin.vf=nodParinte;
        Vecin.cost=cost;
        gPrim[nodFiu].push_back(Vecin);
    }
}

void dfs(int nod, int parinte, int nivel, int cost){
    father[nod]=parinte;
    level[nod]=nivel;
    price[nod]=cost;
    for(int i=0; i<gPrim[nod].size(); ++i)
        if(!level[gPrim[nod][i].vf])
            dfs(gPrim[nod][i].vf, nod, nivel+1, gPrim[nod][i].cost);
}

int query(int x, int y){
    int rezultat=0;
    if(level[y]<level[x]) swap(x, y);
    while(level[y]!=level[x]){
        rezultat=max(rezultat, price[y]);
        y=father[y];
    }
    while(x!=y){
        rezultat=max(rezultat, max(price[x], price[y]));
        x=father[x]; y=father[y];
    }
    return rezultat;
}

void rez(){
    int x, y;
    for(int i=1; i<=k; ++i){
        fscanf(fin, "%d%d", &x, &y);
        fprintf(fout, "%d\n" ,query(x, y));
    }
    fclose(fout);
}