Cod sursa(job #7514)

Utilizator goguGogu Marian gogu Data 21 ianuarie 2007 16:39:24
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define MaxM 31000
#define pow(x) (1<<(x))

using namespace std;

int n, m, nr;
int x[MaxM], y[MaxM], c[MaxM];
char ok[16000];
vector <int> vec[16000], cost[16000];

int bun(int x, int y, int cmax)
{
    memset(ok, 1, n);
    int i, j=0, k, nr=1;
    c[0]=x;
    ok[x]=0;
    while (j<nr && ok[y]){
          k=c[j], j++;
          int gr=vec[k].size();
          for (i=0; i<gr; i++)
              if (ok[vec[k][i]]>0 && cost[k][i]<=cmax){
                 int v=vec[k][i];
                 ok[v]=0;
                 c[nr++]=v;
              }
    }
    return (ok[y]==0);
}

int main()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);
    int i,j,k;
    scanf("%d %d %d", &n, &m, &nr);
    for (i=0; i<m; i++){
        scanf("%d %d %d", x+i, y+i, c+i);
        x[i]--; y[i]--;
        vec[x[i]].push_back(y[i]); cost[x[i]].push_back(c[i]);
        vec[y[i]].push_back(x[i]); cost[y[i]].push_back(c[i]);
    }
    for (i=0; i<nr; ++i){
        int st, fn, sol=1<<30;
        scanf("%d %d", &st, &fn);
        st--; fn--;
        for (int p=30; p>=0; p--)
            if (bun(st, fn, sol-pow(p))) sol-=pow(p);
        printf("%d\n", sol);
    }
    return 0;
}