Cod sursa(job #67606)

Utilizator ViksenVictor-Nicolae Savu Viksen Data 25 iunie 2007 12:33:51
Problema Sate Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 10-a Marime 1.12 kb
#include <stdio.h>
#include <string.h>

struct point { int v,c ; point *l; } *G[30001];
int U[30001],Q[30001],n,m,src,dst,dist;

void edge ( int x , int y , int c )
{
 	point *p= new point;
    p->v = y;
    p->c = c;
    p->l = G[x];
    G[x] = p;
}

void ReadData ()
{
 	int x,y,c,i;
	freopen ( "sate.in" , "r" , stdin );
    scanf ( "%d %d %d %d" , &n , &m , &src , &dst );
    memset ( G , 0 , sizeof ( G ) );
    for ( i=0 ; i<m ; i++ ) {
       scanf ( "%d %d %d" , &x , &y , &c );
       edge ( x , y , c );
       edge ( y , x , -c );
    }
    fclose ( stdin );
}

void WriteData ()
{
 	freopen ( "sate.out" , "w" , stdout );
    printf ( "%d\n" , dist );
    fclose ( stdout );
}

int Solve ()
{
    point *p;
    int fst,lst;
    for (Q[0]=src, fst=0, lst=1; fst<lst ; fst++ )
       for ( p = G[ Q[fst] ] ; p ; p = p->l )
          if (!U[p->v]) {
            Q[lst++]=p->v;
            U[p->v] = U[ Q[fst] ] + p->c;
            if (p->v == dst ) return U[dst];
          }
    return 0;
}

int main ()
{
 	ReadData ();
    dist = Solve ();
    WriteData ();
    return 0;
}