Cod sursa(job #271426)

Utilizator razyelxrazyelx razyelx Data 5 martie 2009 12:05:34
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream.h>
ifstream in("sate.in");
ofstream out("sate.out");

int n,m,s,d;

struct sate{int x,y,l;
	    sate *urm;} *prim,*ultim;

void adauga(int x,int y,int l){
     sate *p;

     p = new sate;
     p->x = x;
     p->y = y;
     p->l = l;
     p->urm= NULL;

     ultim->urm = p;
     ultim = p;
}
void citire(){
     int x,y,l;
     in>>n>>m>>s>>d;

     //adauga prim
     in>>x>>y>>l;

     sate *p;
     p = new sate;
     p->x = x;
     p->y = y;
     p->l = l;
     p->urm= NULL;

     prim = ultim = p;

     while(in>>x>>y>>l) adauga(x,y,l);
}
void afisare(){
     for(sate *p = prim;p!=NULL;p=p->urm)
	out<<p->x<<" "<<p->y<<" "<<p->l<<"\n";
}
int abs(int x){
    if(x<0) return -x;
    return x;
}
int cauta(int x,int y,int l){
    for(sate *p=prim;p!=NULL;p=p->urm)
       if(p->x == x && p->y == y && p->l == l) return 1;
    return 0;
}
int solve(){
     sate *q,*p,*r;
     int l;

     for(q = prim;q!=NULL;q=q->urm)

	for(p = prim;p!=NULL;p=p->urm)

	    if(q->y == p->y){
	      if(q->x < p->x){
		l = abs((q->l) - (p->l));
		if(q->x == s && p->x==d)return l;
		if(!cauta(q->x,p->x,l))	adauga(q->x,p->x,l);

	      } else if(q->x > p->x){
		       l = abs(q->l - p->l);
		       if(p->x == s && q->x == d) return l;
		       if(!cauta(p->x,q->x,l))adauga(p->x,q->x,l);
	      }
	    } else if(q->y == p->x){
		     if(q->x ==s && p->y  == d) return (q->l+p->l);
		     if(!cauta(q->x,p->y,q->l+p->l))adauga(q->x,p->y,q->l+p->l);
		   } else if(q->x == p->y){
			    if(p->x == s && q->y == d) return (q->l+p->l);
			    if(!cauta(p->x,q->y,q->l+p->l))adauga(p->x,q->y,q->l+p->l);
			  }
}
int main(){
    citire();
    out<<solve();
    //afisare();
    return 0;
}