Cod sursa(job #271499)

Utilizator razyelxrazyelx razyelx Data 5 martie 2009 14:09:25
Problema Sate Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 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)

		 d[p->info] = abs(p->l - d[st[prim]]);

	       if(st[prim] > p->info && st[1] > p->info)

		 d[p->info] = abs(p->l - d[st[prim]]);

	       if(st[prim] < p->info && st[1] < p->info)
		 d[p->info] = p->l + d[st[prim]];
	     }
	  prim++;
     }
}
void afisare(){
     /*for(int i=1;i<=n;++i){

	for(nod *p = VF[i];p!=NULL;p=p->urm)

	   out<<p->info<<" ";
	out<<"\n";
     }*/
     for(int i=1;i<=n;++i)
	out<<d[i]<<" ";
}
int main(){
    citeste();
    parcurge(x);
    //afisare();
    out<<d[y];

    return 0;
}