Cod sursa(job #282476)

Utilizator andyciupCiupan Andrei andyciup Data 17 martie 2009 18:17:33
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
#define N 30300
#define M 100100
int n, m, x, y;
struct muchie
{
	int x,y,c;
};
muchie v[M];
int *a[N], *b[N], deg[N]={0}, coada[N], d[N]={0};
void citesc(){
	scanf("%d", &n);
	scanf("%d", &m);
	scanf("%d", &x);
	scanf("%d", &y);
	for(int i=1;i<=m;++i){
		scanf("%d%d", &v[i].x, &v[i].y);
		scanf("%d", &v[i].c);
		deg[v[i].x]++;
		deg[v[i].y]++;
	}
	int i;
	fclose(stdin);
	for(i=1; i<=n;++i){
		a[i]=new int[deg[i]+1];
		a[i][0]=0;
		b[i]=new int[deg[i]+1];
		b[i][0]=0;
	}
}

void aloc(){
	int d, e, cost;
	for(int i=1;i<=m;++i){
		d=v[i].x;
		e=v[i].y;
		cost=v[i].c;
		a[e][++a[e][0]]=d;
		a[d][++a[d][0]]=e;
		b[e][++b[e][0]]=-cost;
		b[d][++b[d][0]]=cost;
	}
}


void bfs(){
	int p=1, u=0, scos, ad, i;
	coada[++u]=x;
	d[x]=0;
	
	while(p<=u){
		scos=coada[p++];
		for(i=1;i<=a[scos][0];++i)
		{
			ad=a[scos][i];
			if(d[ad]==0)
			{
				coada[++u]=ad;
				d[ad]=b[scos][i]+d[scos];
			}
		}
	}
	printf("%d\n",d[y]);
}

int main(){
	freopen("sate.in", "r", stdin);
	freopen("sate.out", "w", stdout);
	citesc();
	aloc();
	//printf("%d", a[1][1]);
	bfs();
	return 0;
}