Cod sursa(job #6997)

Utilizator alextheroTandrau Alexandru alexthero Data 21 ianuarie 2007 11:35:19
Problema Radiatie Scor 30
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.89 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define nmax 15005
#define mmax 30005
#define infinite 2000000000

using namespace std;
int cost[mmax],x[mmax],y[mmax],n,m,k,place[nmax],d[nmax],sx,sy;
int coada[nmax],bagat[nmax];
vector <int> much[nmax];

int cmp(int i,int j) {
    return cost[i]>=cost[j] ? 0 : 1;
}

inline int min(int i,int j) {
    if(i>j) return j;
    else return i;
}

inline int max(int i,int j) {
    if(i>j) return i;
    else return j;
}

int relaxeaza(int u,int v,int c) {
    if(d[u]!=infinite) 
        d[v]=min(d[v],max(d[u],c));
    if(d[v]!=infinite) 
        d[u]=min(d[u],max(d[v],c));
}

int drum(int i,int j) {
    coada[0]=1;
    coada[1]=i;
    for(int k=1;k<=n;k++) {
        d[k]=infinite; 
        bagat[k]=0;
    }
    d[i]=0;
    bagat[i]=1;
    while(coada[0]>0) {
        int nod=coada[coada[0]];
        coada[0]--;
        for(int i=0;i<much[nod].size();i++) {
            int n1=x[much[nod][i]];
            int n2=y[much[nod][i]];
            int c=cost[much[nod][i]];
            if(n1!=nod) n1^=n2^=n1^=n2;
            if(d[n2]>max(d[n1],c)) {
                d[n2]=max(d[n1],c);  
                if(!bagat[n2]) {
                    coada[++coada[0]]=n2;
                    bagat[n2]=1;
                }
            }
        }
        bagat[nod]=0;
    }
    return d[j];
}

int main() {
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    scanf("%d %d %d\n",&n,&m,&k);
    for(int i=1;i<=m;i++) {
        scanf("%d %d %d\n",&x[i],&y[i],&cost[i]);
        place[i]=i;
    }
    sort(place+1,place+m+1,cmp);
    for(int i=1;i<=m;i++) {
        much[x[place[i]]].push_back(place[i]);
        much[y[place[i]]].push_back(place[i]);
    }
    for(int i=1;i<=k;i++) {
        scanf("%d %d\n",&sx,&sy);
        printf("%d\n",drum(sx,sy));
    }    
    return 0;
}