Cod sursa(job #281556)

Utilizator adelinavVidovici Adelina adelinav Data 15 martie 2009 12:31:00
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
#define NMAX 30000

int n,m,start,end;

struct nod{
	int info,ds;
	nod *adr;
};

struct lista{
	nod *vf,*sf;
};

lista vl[NMAX+1];

void addend(lista &l,int x,int dist){
	nod *n=new nod;
	n->info=x;
	n->adr=NULL;
	n->ds=dist;
	if(!l.vf) l.vf=n;
	else l.sf->adr=n;
	l.sf=n;
}

int coada[NMAX+1],li=1,ls=0,d[NMAX+1],viz[NMAX+1];

void pune(int x){
	coada[++ls]=x;
	viz[x]=1;
}

void scoate(int &x){
	x=coada[li++];
}

int coadavida(){
	return li>ls;
}

int main(){
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	
	int i,x,y,z,ok=0;
	nod *nc;
	scanf("%d%d%d%d",&n,&m,&start,&end);
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		addend(vl[x],y,z);
		addend(vl[y],x,z);
	}
	pune(start);
	while(!coadavida()&&!ok){
		scoate(x);
		nc=vl[x].vf;
		while(nc){
			y=nc->info;
			if(!viz[y]){ 
				pune(y);
				if(y>x) d[y]=d[x]+nc->ds;
				else d[y]=d[x]-nc->ds;
			}
			if(y==end){ 
				ok=1; 
				break;
			}
			nc=nc->adr;
		}
	}
	printf("%d ",d[end]);
	return 0;
}