Cod sursa(job #984020)

Utilizator stefanzzzStefan Popa stefanzzz Data 13 august 2013 12:30:58
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define MAXM 30005
#define MAXN 15005
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");

struct muchie{
    int nod1,nod2,cost;};

int n,m,k,tata[MAXN],a,b,aux,grad[MAXN],cst[MAXN],mx,lvl[MAXN];
muchie muchii[MAXM];
vector<int> G[MAXN];

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

void DFS(int p);

int main()
{
    int i;
    f>>n>>m>>k;
    for(i=1;i<=m;i++)
        f>>muchii[i].nod1>>muchii[i].nod2>>muchii[i].cost;
    sort(muchii+1,muchii+m+1,Comp);
    for(i=1;i<=m;i++){
        a=muchii[i].nod1;
        b=muchii[i].nod2;
        while(tata[a])
            a=tata[a];
        while(tata[b])
            b=tata[b];
        if(a==b)
            continue;
        if(grad[a]>grad[b]){
            aux=a;
            a=b;
            b=aux;}
        grad[b]+=grad[a]+1;
        tata[a]=b;
        cst[a]=muchii[i].cost;
        G[b].push_back(a);}
    for(i=1;i<=n;i++)
        if(!tata[i])
            DFS(i);
    for(i=1;i<=k;i++){
        f>>a>>b;
        mx=0;
        while(lvl[a]>lvl[b]){
            if(cst[a]>mx)
                mx=cst[a];
            a=tata[a];}
        while(lvl[b]>lvl[a]){
            if(cst[b]>mx)
                mx=cst[b];
            b=tata[b];}
        while(a!=b){
            if(cst[a]>mx)
                mx=cst[a];
            if(cst[b]>mx)
                mx=cst[b];
            a=tata[a];
            b=tata[b];}
        g<<mx<<'\n';}
    f.close();
    g.close();
    return 0;
}

void DFS(int p){
    int i;
    for(i=0;i<G[p].size();i++){
        lvl[G[p][i]]=lvl[p]+1;
        DFS(G[p][i]);}}