Cod sursa(job #43530)

Utilizator TabaraTabara Mihai Tabara Data 30 martie 2007 11:31:22
Problema PScNv Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
//70
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define in "pscnv.in"
#define out "pscnv.out"
#define NMAX 250010
#define INF 9000001

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

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

PNOD L[NMAX];

char x[10000000];
int n, nod_p, nod_s, d[NMAX], color[NMAX], q[NMAX], m, minim;
int prim, ultim, suma;

int BF(int,int);
void Read();
void Add(int,int,int);
void Solve();

int main()
{
    Read();
    Solve();
    
    freopen( out, "w", stdout );
    printf( "%d\n", minim );
    
    return 0;
}

void Read()
{
     freopen( in, "r", stdin );
     
     scanf( "%d %d %d %d\n", &n, &m, &nod_p, &nod_s );
     int v1, v2, cost;
     int i;
     fread( x, sizeof(char), 10000000, stdin );
     char *p;
     
     p = strtok( x, " " );
     v1 = atoi( p );
     p = strtok ( 0, " " );
     v2 = atoi( p );
     p = strtok( 0, "\n" );
     cost = atoi( p );
     Add( v1, v2, cost );
     d[v1] = d[v2] = cost;
     suma += cost;
     
     for ( i = 2; i <= m; ++i )
     {
         //fscanf( fin, "%ld%ld%ld", &v1, &v2, &cost );
         p = strtok( 0, " " );
         v1 = atoi( p );
         p = strtok( 0, " " );
         v2 = atoi( p );
         p = strtok( 0, "\n" );
         cost = atoi( p );
         Add(v1,v2,cost);
         suma += cost;
         d[v1] = d[v2] = INF;
         //fprintf( fout, "%ld %ld %ld\n", v1, v2, cost );
     }
}

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

int BF( int nod, int intmita )
{
     PNOD j;
     int i;
     for ( i = 1; i <= n; ++i ) 
     {
             d[i] = INF;
             color[i] = ALB; 
     }
     color[nod] = GRI;
     prim = ultim = 1;
     q[ultim] = nod;
     d[nod] = 0;
     
     while ( prim <= ultim )
     {
           i = q[prim];
           for ( j = L[i]; j; j = j->next )
               if ( color[j->vf] != NEGRU && j->cost <= intmita )
               {
                    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 Solve()
{
     int k, step;
     for (step = 1; step <= suma; step <<= 1) ;
     for (k = 0; step; step >>= 1)
     {
         if( k + step <= suma && !BF(nod_p, k + step) ) k += step;
     }

     minim = k + 1;
}