Cod sursa(job #244908)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 16 ianuarie 2009 12:29:30
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#include <stdlib.h>
#define N 30005
int n,m,X,Y,p=1,s;
int *a[N],*b[N],coada[N],sum[N],ok[N];
/*void bfs(int x,int s,int t){
	if(x==Y){
		printf("%d\n",s); ok=0;
		return;
	}
	for(int i=1;i<=a[x][0] && ok;i++)
		if(a[x][i]!=t){
			if(a[x][i]<x) bfs(a[x][i],s-b[x][i],x);
			else bfs(a[x][i],s+b[x][i],x);
		}
}*/
void bfs(int x){
	for(int i=1;i<=a[coada[x]][0];i++)
		if(ok[a[coada[x]][i]]==0){
			coada[++coada[0]]=a[coada[x]][i];
			if(a[coada[x]][i]>coada[x]) p=1;
				else p=-1;
			sum[coada[0]]=sum[x]+p*b[coada[x]][i];
			ok[a[coada[x]][i]]=1;
			if(a[coada[x]][i]==Y) s=sum[coada[0]];
		}
}
int main(){
	int i,x1,x2,d;
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&X,&Y);
	for(i=1;i<=n;i++){
		a[i]=(int*)malloc(4);a[i][0]=0;
		b[i]=(int*)malloc(4);b[i][0]=0;
	}
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&x1,&x2,&d);
		a[x1][0]++;b[x1][0]++;
		a[x1]=(int*)realloc(a[x1],(a[x1][0]+2)*4);
		b[x1]=(int*)realloc(b[x1],(b[x1][0]+2)*4);
		a[x1][a[x1][0]]=x2;b[x1][b[x1][0]]=d;
		a[x2][0]++;b[x2][0]++;
		a[x2]=(int*)realloc(a[x2],(a[x2][0]+2)*4);
		b[x2]=(int*)realloc(b[x2],(b[x2][0]+2)*4);
		a[x2][a[x2][0]]=x1;b[x2][b[x2][0]]=d;
	}
	coada[0]=1;
	coada[1]=X;
	ok[X]=1;
	for(i=1;i<=coada[0] && !s;i++)
		bfs(i);
	//bfs(X,0,-1);
	printf("%d\n",s);
	return 0;
}