Cod sursa(job #595252)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 11 iunie 2011 18:33:14
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m,start,final,sol[30010];
struct S{int nod,cost;};
S *A[30010],Coada[30010];
int inc=-1,sf;
bool vizitat[30010];

void BFS(int x)
{
	int i,limita,y;
	vizitat[x]=true;
	inc++;
	Coada[inc].nod=x;
	Coada[inc].cost=0;
	while(sf<=inc && sol[final]==0)
	{
		x=Coada[sf].nod;
		sf++;
		limita=A[x][0].nod;
		for(i=1;i<=limita && sol[final]==0;i++)
		{
			y=A[x][i].nod;
			if(vizitat[y]==false)
			{
				vizitat[y]=true;
				if(x<=y)
					sol[y]=sol[x]+A[x][i].cost;
				else
					sol[y]=sol[x]-A[x][i].cost;
				Coada[++inc]=A[x][i];
			}
		}
	}
}

int main()
{
	int i,x,y,z;
	freopen("sate.in","r",stdin);
	scanf("%d %d %d %d",&n,&m,&start,&final);
	for(i=1;i<=n;i++)
	{
		A[i]=(S *)realloc(A[i],sizeof(S));
		A[i][0].nod=0;
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&z);
		A[x][0].nod++;
		A[x]=(S *)realloc(A[x],(A[x][0].nod+1)*sizeof(S));
		A[x][A[x][0].nod].nod=y;
		A[x][A[x][0].nod].cost=z;
		A[y][0].nod++;
		A[y]=(S *)realloc(A[y],(A[y][0].nod+1)*sizeof(S));
		A[y][A[y][0].nod].nod=x;
		A[y][A[y][0].nod].cost=z;
	}
	
	BFS(start);
	
	freopen("sate.out","w",stdout);
	printf("%d\n",sol[final]); 
	return 0;
}