Cod sursa(job #365206)

Utilizator cristiprgPrigoana Cristian cristiprg Data 18 noiembrie 2009 09:15:33
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#define DIM 30005
#define pb push_back
using namespace std;
inline int myabs(int x){return x<0?-x:x;}
struct matrice
{
	int vecin, cost;
};

int n, m, x, y, v[DIM], dist[DIM];
vector <matrice> A[DIM];
queue <int> Q;

void solve()
{
	int nod;
	Q.push(x);
	v[x] = 1;
	while (1)
	{
		nod = Q.front();
		Q.pop();
		
		for (int i = 1; i <= A[nod][0].vecin; ++i)
			if (!v[ A[nod][i].vecin ])
			{
				if ( A[nod][i].vecin > nod) // daca vecinu ii in dreapta
					dist[ A[nod][i].vecin ] = A[nod][i].cost + dist[nod];  //cresc
					
				else //daca ii in stanga
					dist[ A[nod][i].vecin ] = - A[nod][i].cost + dist[nod];  //scad
				
				v[ A[nod][i].vecin ] = 1;
				Q.push( A[nod][i].vecin );
			}
		
		if (nod == y) // !!!
		{
			FILE *f = fopen("sate.out", "w");
			fprintf(f, "%d\n", myabs(dist[y]));
			
			for (int i = 1; i <= n; ++i)
				printf ("%d ", dist[i]);
			return;
		}
	}
}

int main()
{
	FILE *f = fopen("sate.in", "r");
	fscanf(f, "%d%d%d%d", &n, &m, &x, &y);
	int i, v1, v2, c;
	matrice z;
	z.vecin = 0, z.cost = 0;
	for (i = 1; i <= n; ++i)
		A[i].pb(z);
	
	for (i = 1; i <= m; ++i)
	{
		fscanf(f, "%d%d%d", &v1, &v2, &c);
		
		++A[v1][0].vecin, ++A[v2][0].vecin;
		z.vecin = v2;
		z.cost = c;
		A[v1].pb(z);
		
		z.vecin = v1;
		z.cost = c;
		A[v2].pb(z);
		
//		printf("v1 = %d v2 = %d\n", A[v1][ A[v1][0].vecin ].vecin, A[v2][ A[v2][0].vecin ].vecin);
		
	}
	fclose(f);
	solve();
	
/*	for (i = 1; i <= n; ++i)
	{
		printf ("%3d ", i);
		for (int j = 1; j <= A[i][0].vecin; ++j)
			printf ("%3d ", A[i][j].vecin);
		
		printf("\n");
	}
	
	*/
	
	
	return 0;
}