Cod sursa(job #1053521)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 12 decembrie 2013 20:04:45
Problema Sate Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.14 kb
#include<fstream>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,m,start,final,sol[30010];
struct S{int nod,cost;};
S *A[30010],Coada[30010];
int inc=-1,sf,ns;
bool vizitat[30010];
char s[1000];

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

int main()
{
	int i,x,y,z,j;
	//parsez citirea
	ifstream fin("sate.in");
	fin.getline(s,999);
	ns=strlen(s);
	//pentru n
	n=s[0]-'0';
	i=1;
	while(s[i]>='0' && s[i]<='9')
	{
		n=n*10+(s[i]-'0');
		i++;
	}
	i++;
	//pentru m
	m=s[i]-'0';
	i++;
	while(s[i]>='0' && s[i]<='9')
	{
		m=m*10+(s[i]-'0');
		i++;
	}
	i++;
	//pentru start
	start=s[i]-'0';
	i++;
	while(s[i]>='0' && s[i]<='9')
	{
		start=start*10+(s[i]-'0');
		i++;
	}
	i++;
	//pentru final
	final=s[i]-'0';
	i++;
	while(s[i]>='0' && s[i]<='9' && i<ns)
	{
		final=final*10+(s[i]-'0');
		i++;
	}
	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++)
	{
		fin.getline(s,999);
		ns=strlen(s);
		//pentru x
		x=s[0]-'0';
		j=1;
		while(s[j]>='0' && s[j]<='9')
		{
			x=x*10+(s[j]-'0');
			j++;
		}
		j++;
		//pentru y
		y=s[j]-'0';
		j++;
		while(s[j]>='0' && s[j]<='9')
		{
			y=y*10+(s[j]-'0');
			j++;
		}
		j++;
		//pentru z
		z=s[j]-'0';
		j++;
		while(s[j]>='0' && s[j]<='9' && j<ns)
		{
			z=z*10+(s[j]-'0');
			j++;
		}
		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;
	}
	fin.close();
	
	BFS(start);
	
	ofstream fout("sate.out");
	fout<<sol[final]<<"\n";
	fout.close();
	return 0;
}