Cod sursa(job #343262)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 25 august 2009 12:55:42
Problema Sate Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
#define N 30001
#define M 100025
#include<vector>
using namespace std;
int n,m,x1,y1,d[N],d1[N];
short int *a[N];
int *a1[N];
bool b[N];
int f[N],g[N],c[N];
inline void parse(int &f,int &g,int &c)
{
	f=g=c=0;
	char s[1<<5],*p;
	fgets(s,1<<5,stdin);
	for(p=s;*p!=' ';++p)
		f=f*10+(*p-'0');
	++p;
	for(;*p!=' ';++p)
		g=g*10+(*p-'0');
	++p;
	for(;*p && *p!='\n';++p)
		c=c*10+(*p-'0');
}

void citire()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	scanf("%d%d%d%d\n",&n,&m,&x1,&y1);
	for (int i=1; i<=m; ++i)
	{
		//scanf("%d%d%d",&f,&g,&c);
		parse(f[i],g[i],c[i]);
		++d1[f[i]];
		++d1[g[i]];
	}
	for (int i=1; i<=n; ++i)
	{
		a[i]=new short int [1+d1[i]];
		a[i][0]=0;
		a1[i]=new int [1+d1[i]];
		a1[i][0]=0;
	}
	for (int i=1; i<=m; ++i)
	{
		a[f[i]][++a[f[i]][0]]=g[i];
		if (f[i]>g[i])
		{
			a1[f[i]][++a1[f[i]][0]]=-c[i];
			a1[g[i]][++a1[g[i]][0]]=c[i];
		}
		else
		{
			a1[f[i]][++a1[f[i]][0]]=c[i];
			a1[g[i]][++a1[g[i]][0]]=-c[i];
		}
		a[g[i]][++a[g[i]][0]]=f[i];
	}
}
void bfs()
{
	int coada[N],u=0,p=0,x,y;
	coada[u++]=x1;
	b[x1]=true;
	while (u!=p)
	{
		x=coada[p++];
		int g=a[x][0]+1;
		for (int i=1; i!=g; ++i)
		{
			y=a[x][i];
			if (!b[y])
			{
				b[y]=true;
				coada[u++]=y;
				d[y]=a1[x][i]+d[x];
			}
		}
	}
}
int main()
{
	citire();
	bfs();
	printf("%d",d[y1]);
	return 0;
}