Cod sursa(job #1701148)

Utilizator alex.kosnean97Cosnean Alexandru alex.kosnean97 Data 12 mai 2016 11:21:26
Problema Sate Scor 0
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.7 kb
#include <fstream>

 using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
 
int N,M,X,Y,D[30001],S[30001],R[30001];
 
struct celula{
       int info,c;
       celula *next;} *V[30001];
 
void ADD(celula *& K,int info,int c){
     celula *p;
     p=new celula;
     p->info=info;
     p->c=c;
     p->next=K;
     K=p;
                         }
void citire(){
     int a,b,c;
     fin>>N>>M>>X>>Y;
     while(fin>>a>>b>>c){
                         ADD(V[a],b,c);
                         ADD(V[b],a,c);}
                         }
int abs(int x){
    if(x<0) return -x;
    return x;
}
void parcurge(int x){
     celula*p;
     int prim,ultim;
 
     prim=ultim=1;
 
     R[prim] = X;
     S[X] = 1;
 
     while(prim <= ultim && !D[Y]){
      for(p = V[R[prim]]; p!=NULL;p=p->next)
 
         if(!S[p->info]){
           S[p->info] = 1;
           R[++ultim] = p->info;
 
         if(R[prim] > p->info && R[1] < p->info)
           D[p->info] = abs(D[R[prim]]-p->c);
 
         if(R[prim] < p->info && R[1]<p->info){
           if(R[1] < R[prim]) D[p->info] = D[R[prim]]+p->c;
           if(R[1] > R[prim]) D[p->info] = abs(p->c - D[R[prim]]);
         }
         if(R[prim] > p->info && R[1] > p->info){
           if(R[prim] > R[1]) D[p->info] = abs(p->c - D[R[prim]]);
           if(R[prim] < R[1]) D[p->info] = D[R[prim]]+p->c;
         }
         if(R[prim]<p->info && R[1] > p->info)
           D[p->info] = abs(D[R[prim]]-p->c);
 
         }
      prim++;
     }
}
void init(){
     for(celula*p=V[X];p!=NULL;p=p->next)
    D[p->info] = p->c;
}
int main(){
    citire();
    init();
    parcurge(X);
    fout<<D[X];
 
    return 0;
}