Cod sursa(job #69595)

Utilizator raula_sanChis Raoul raula_san Data 3 iulie 2007 16:29:19
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <cstdio>

#define input "sate.in"
#define output "sate.out"

#define MAX_N 30001

struct NOD
{      
       int i, c;
       NOD *next;
       
} *L[MAX_N], *E[MAX_N], *C, *EC;

int N, M, X, Y;
int D[MAX_N], USE[MAX_N];

void READ();
void SOLVE();
void PRINT();

void ADD(NOD *&, NOD *&, int, int);

int main()
{
    READ();
    SOLVE();
    
    return 0;
}

void READ()
{
     FILE *f = fopen(input, "rt");
     
     int i, a, b, c;
     
     for(fscanf(f, "%d %d %d %d", &N, &M, &X, &Y), i=1; i<=M; ++i)
     {
                   fscanf(f, "%d %d %d", &a, &b, &c);
                   
                   ADD(L[a], E[a], b, c);
                   ADD(L[b], E[b], a, c);
     }
          
     fclose(f);
}

void SOLVE()
{
     USE[X] = 1;
     
     C = new NOD;
     C -> i = X;
     C -> next = NULL;
     EC = C;
     
     while(C)
     {
             NOD *g = L[C -> i];
             
             while(g)
             {
                     if(!USE[g -> i])
                     {
                               USE[g -> i] = 1;
                               
                               if(C -> i < g -> i)
                                    D[g -> i] = D[C -> i] + g -> c;
                     
                               else
                                   D[g -> i] = D[C -> i] - g -> c;
                                   
                               NOD *p = new NOD;
                               p -> i = g -> i;
                               p -> next = NULL;
                               EC -> next = p;
                               EC = p;
                               
                               if(g -> i == Y)
                               {
                                    PRINT();
                                    return;
                               }
                     }

                     g = g -> next;
             }
             
             g = C;
             C = C -> next;
             delete g;
     }
}

void PRINT()
{
     FILE *g = fopen(output, "wt");
     
     fprintf(g, "%d", D[Y]);
     
     fclose(g);
}

void ADD(NOD *&L, NOD *&E, int i, int c)
{
     NOD *p = new NOD;
     p -> i = i;
     p -> c = c;
     
     p -> next = NULL;
     
     if(L == NULL)
     {
          L = E = p;
     }
     
     else
     {
         E -> next = p;
         E = p;
     }
}