Cod sursa(job #209013)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 20 septembrie 2008 10:10:10
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 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(int mic,int mare,int dis),bfs();
int main()
{
	readd();
	solve();
	return 0;
}
void readd()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	scanf("%d%ld%d%d",&n,&m,&x,&y);
	if(x==y){solved=1;printf("0\n");return;}
	if(x>y){p=x;x=y;y=p;}
	for(i=1;i<=m;i++)
	{ scanf("%d%d%d",&p,&q,&di);
	  if(p<q)pune(p,q,di);
	  else pune(q,p,di);
	}
}
void solve()
{       if(solved)return;
	bfs();
	printf("%d",d[y]);
}
void pune(int mic,int mare,int dis)
{
	paux=new nod;
	paux->inf=mare;
	paux->dist=dis;
	paux->urm=(prim[mic])?prim[mic]:0;
	prim[mic]=paux;
	paux=new nod;
	paux->inf=mic;
	paux->dist=-dis;
	paux->urm=(prim[mare])?prim[mare]:0;
	prim[mare]=paux;
}
void bfs()
{
	t=b=1;
	co[t]=x;viz[x]=1;
	while(t<=b)
	{ act=co[b];
	  for(paux=prim[act];paux;paux=paux->urm)
	  { if(viz[paux->inf])continue;
	    d[paux->inf]=d[act]+paux->dist;
	    if(paux->inf==y)return;
	    t++;
	    co[t]=paux->inf;
	    viz[paux->inf]=1;
	  }
	  b++;
	}
}