Cod sursa(job #3754)

Utilizator TabaraTabara Mihai Tabara Data 28 decembrie 2006 16:15:29
Problema PScNv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
using namespace std;

#define in "pscnv.in"
#define out "pscnv.out"
#define NMAX 25010
#define INF 3000001

#define ALB 0
#define GRI 1
#define NEGRU 2

typedef long int LI;
typedef struct nod {
        LI vf;
        LI cost;
        nod* next;
} *PNOD, NOD;

PNOD L[NMAX];

LI n, nod_p, nod_s, d[NMAX], color[NMAX], q[NMAX], m;
LI prim, ultim;

int BF(LI,LI);
void Read();
void Add(LI,LI,LI);
void Cautare(LI,LI);

FILE *fout = fopen( out, "w" );
LI minim, suma;

int main()
{
    Read();
    minim = INF;
    Cautare(0, suma);
    fprintf( fout, "%ld\n", minim );
    fclose( fout );
    return 0;
}

void Read()
{
     FILE *fin = fopen( in, "r" );
     fscanf( fin, "%ld%ld%ld%ld", &n, &m, &nod_p, &nod_s );
     LI v1, v2, cost;
     LI i;
     for ( i = 1; i <= m; ++i )
     {
         fscanf( fin, "%ld%ld%ld", &v1, &v2, &cost );
         Add(v1,v2,cost);
         suma += cost;
         d[v1] = d[v2] = INF;
     }
     fclose( fin );
}

void Add(LI i, LI j, LI cost )
{
     PNOD p = new NOD;
     p->vf = j;
     p->cost = cost;
     p->next = L[i];
     L[i] = p;
}

int BF( LI nod, LI limita )
{
     PNOD j;
     LI i;
     for ( i = 1; i <= n; ++i ) 
     {
             d[i] = INF;
             color[i] = ALB; 
     }
     d[nod] = 0;
     
     color[nod] = GRI;
     prim = ultim = 1;
     q[ultim] = nod;
     
     while ( prim <= ultim )
     {
           i = q[prim];//extrag capul cozii
           for ( j = L[i]; j; j = j->next )
               if ( color[j->vf] != NEGRU && j->cost <= limita )
               {
                    color[j->vf] = GRI;
                    ultim++;
                    q[ultim] = j->vf;
                    d[j->vf] = d[i] + 1;
                    if ( j->vf == nod_s ) return 1;
               }
           prim++;
           color[i] = NEGRU;
     }
     return 0;
}

void Cautare( LI st, LI dr )
{
     LI mijl = (st+dr )>>1;
     if ( dr < minim )
     {
          minim = dr;
     }
     else return;
     
     if ( BF ( nod_p, mijl ) ) Cautare( st, mijl );
     else                      Cautare( mijl+1, dr );
}