Cod sursa(job #1367730)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 2 martie 2015 02:13:33
Problema Radiatie Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>L[100100];
struct lab{
    int x;
    int y;
    int c;
}v[100100];
int n,m,k,i,j,a,b,nr,ra,rb,t[100100],C[100100],x[100100],viz[100100];
FILE *f,*g;
int cmp(lab a,lab b){
    return a.c<b.c;
}
int rad(int r){
    while(t[r]>0){
        r=t[r];
    }
    return r;
}
void dfs(int nod,int niv){
    x[nod]=niv;
    viz[i]=1;
    for(int i=0;i<L[nod].size();i++){
        if(!viz[i])
            dfs(L[nod][i],niv+1);
    }
}
int maxim(int a,int b){
    if(a>b)
        return a;
    return b;
}
int main(){
    f=fopen("radiatie.in","r");
    g=fopen("radiatie.out","w");
    fscanf(f,"%d%d%d",&n,&m,&k);
    for(i=1;i<=n;i++){
        t[i]=-1;
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&v[i].x,&v[i].y,&v[i].c);
    }
    sort(v+1,v+m+1,cmp);
    for(i=1;i<=m;i++){
        ra=rad(v[i].x);
        rb=rad(v[i].y);
        if(ra!=rb){
            if(t[ra]<t[rb]){
                t[ra]+=t[rb];
                t[rb]=ra;
                L[ra].push_back(rb);
                C[rb]=v[i].c;
            }
            else{
                t[rb]+=t[ra];
                t[ra]=rb;
                L[rb].push_back(ra);
                C[ra]=v[i].c;
            }
        }
    }
    for(i=1;i<=n;i++){
        if(t[i]<0){
            dfs(i,1);
            break;
        }
    }
    for(i=1;i<=k;i++){
        fscanf(f,"%d%d",&a,&b);
        nr=0;
        while( x[a] > x[b] ){
            nr=maxim(nr,C[a]);
            a=t[a];
        }
        while( x[a] < x[b] ){
            nr=maxim(nr,C[b]);
            b=t[b];
        }
        while(a!=b){
            nr=maxim( nr, maxim( C[a],C[b] ) );
            a=t[a];
            b=t[b];
        }
        fprintf(g,"%d\n",nr);
    }


    fclose(f);
    fclose(g);
    return 0;
}