Cod sursa(job #209018)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 20 septembrie 2008 10:24:38
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#define N 30002
struct nod{ long inf,dist;nod *urm;};
nod *paux,*prim[N];
int n,m,x,y,p,q,di,i,solved,d[N],t,b,co[N],viz[N],act;
void readd(),solve(),pune(),bfs();
int main()
{
	readd();
	solve();
	return 0;
}
void readd()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&x,&y);
	if(x>y){p=x;x=y;y=p;}
	for(i=1;i<=m;i++)
	{ scanf("%d%d%d",&p,&q,&di);
	  pune();
	}
}
void solve()
{       if(solved)return;
	bfs();
	printf("%d",d[y]);
}
void pune()
{
	paux=new nod;
	paux->inf=q;
	paux->dist=di;
	paux->urm=(prim[p])?prim[p]:0;
	prim[p]=paux;
	paux=new nod;
	paux->inf=p;
	paux->dist=-di;
	paux->urm=(prim[q])?prim[q]:0;
	prim[q]=paux;
}
void bfs()
{
	t=b=1;
	co[t]=x;viz[x]=1;
	while(b<=t)
	{ act=co[b];
	  for(paux=prim[act];paux;paux=paux->urm)
	  { if(viz[paux->inf])continue;
	    d[paux->inf]=d[act]+paux->dist;
	    t++;
	    co[t]=paux->inf;
	    viz[paux->inf]=1;
	  }
	  b++;
	}
}