Cod sursa(job #263358)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 20 februarie 2009 11:59:14
Problema Sate Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<stdio.h>
const int M=100024, N=30000;
struct much{ int s,d,c; } muchie[M];
int nr[N];
int dx[N],q[N],p,u;
char viz[N];
int main()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	int n,m,x,y,i;
	int *v[N], *d[N];
	
	scanf("%d%d%d%d",&n,&m,&x,&y);
	for(i=0;i<m;++i)
	{
		scanf("%d%d%d",&muchie[i].s,&muchie[i].d,&muchie[i].c);
		++nr[muchie[i].s]; ++nr[muchie[i].d];
	}
	for(i=1;i<=n;++i)
	{
		v[i]=new int[nr[i]+1];
		d[i]=new int[nr[i]+1];
		v[i][0]=0;
	}
	for(i=0;i<m;++i)
	{
		v[muchie[i].s][ ++v[ muchie[i].s ][0] ] = muchie[i].d;
		d[muchie[i].s][ v[muchie[i].s][0] ] = muchie[i].c;
		
		v[muchie[i].d][ ++v[ muchie[i].d ][0] ] = muchie[i].s;
		d[muchie[i].d][ v[muchie[i].d][0] ] = muchie[i].c;
	}
	
	p=-1; u=0; viz[x]=1; q[0]=x;
	while(p<u)
	{
		++p;
		for(i=1;i<=nr[q[p]];++i)
		{
			if(viz[v[q[p]][i]]) continue;
			
			q[++u]=v[q[p]][i];
			if(q[u]==y)
			{
				if(q[p]<q[u])
					//dx[q[u]]=dx[q[p]]+d[q[p]][i];
					printf("%d\n",dx[q[p]]+d[q[p]][i]);
				else
					//dx[q[u]]=dx[q[p]]-d[q[p]][i];
					printf("%d\n",dx[q[p]]-d[q[p]][i]);
				return 0;
			}
			viz[v[q[p]][i]]=1;
			if(q[p]<q[u])
				dx[q[u]]=dx[q[p]]+d[q[p]][i];
			else
				dx[q[u]]=dx[q[p]]-d[q[p]][i];
		}
	}
	return 0;
}