Cod sursa(job #343365)

Utilizator rumburakrumburak rumburak Data 25 august 2009 17:24:03
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<cstdio>
#include<vector>

using namespace std;

const int N=(1<<15);

int n,m,dd[N];
short int x0,y0;

vector<int> d[N];
vector<short int> a[N];

void citire()
{
	short int x,y;
	int dist,i;
	char sir[22];
	scanf("%d%d%hd%hd\n",&n,&m,&x0,&y0);
	while(m--)
	{
		fgets(sir,22,stdin);
		for(i=0,x=0 ; sir[i]!=' ' ;++i)
			x=x*10+sir[i]-'0';
		++i;
		for(y=0 ; sir[i]!=' ' ; ++i)
			y=y*10+sir[i]-'0';
		++i;
		for(dist=0 ; sir[i]!='\n' ; ++i)
			dist=dist*10+sir[i]-'0';
		//scanf("%hd%hd%d",&x,&y,&dist);
		a[x].push_back(y);
		a[y].push_back(x);
		d[x].push_back(dist);
		d[y].push_back(-dist);
	}
}

int CL()
{
	short int i,s,p=1,u=0,x,y,coada[N];
	coada[++u]=x0;
	dd[x0]=1;
	while(p!=1+u)
	{
		x=coada[p++];
		for(i=0,s=a[x].size() ; i<s ; ++i)
		{
			y=a[x][i];
			if(dd[y]==0)
			{
				dd[y]=dd[x]+d[x][i];
				coada[++u]=y;
				if(y==y0)
					return dd[y]-1;
			}
		}
	}
	return -1;
}

int main()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	citire();
	printf("%d\n",CL());
	return 0;
}