Cod sursa(job #271525)

Utilizator razyelxrazyelx razyelx Data 5 martie 2009 14:37:49
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream.h>
#define max 30001

ifstream in("sate.in");
ofstream out("sate.out");

int n,m,x,y,d[max],s[max],st[max];

struct nod{int info,l;
	   nod *urm;} *VF[max];

void adauga(nod *&prim,int info,int l){
     nod *p;
     p = new nod;
     p->info = info;
     p->l = l;
     p->urm = prim;
     prim = p;
}
void citeste(){
     int a,b,l;
     in>>n>>m>>x>>y;
     while(in>>a>>b>>l){adauga(VF[a],b,l);adauga(VF[b],a,l);}
}
int abs(int x){
    if(x<0) return -x;
    return x;
}
void parcurge(int x){
     nod *p;
     int prim,ultim;

     prim = ultim = 1;

     st[prim] = x;
     s[x] = 1;

     while(prim <= ultim && !d[y]){
	  for(p = VF[st[prim]]; p!=NULL;p=p->urm)

	     if(!s[p->info]){
	       s[p->info] = 1;
	       st[++ultim] = p->info;

	     if(st[prim] > p->info && st[1] < p->info)
	       d[p->info] = abs(d[st[prim]]-p->l);

	     if(st[prim] < p->info && st[1]<p->info){
	       if(st[1] < st[prim]) d[p->info] = d[st[prim]]+p->l;
	       if(st[1] > st[prim]) d[p->info] = abs(p->l - d[st[prim]]);
	     }
	     if(st[prim] > p->info && st[1] > p->info){
	       if(st[prim] > st[1]) d[p->info] = abs(p->l - d[st[prim]]);
	       if(st[prim] < st[1]) d[p->info] = d[st[prim]]+p->l;
	     }
	     if(st[prim]<p->info && st[1] > p->info)
	       d[p->info] = abs(d[st[prim]]-p->l);

	     }
	  prim++;
     }
}
void init(){
     for(nod*p=VF[x];p!=NULL;p=p->urm)
	d[p->info] = p->l;
}
int main(){
    citeste();
    init();
    parcurge(x);
    out<<d[y];

    return 0;
}