Cod sursa(job #398272)

Utilizator dexter_dexMutascu Adrian - Dragos dexter_dex Data 18 februarie 2010 13:08:25
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>
#include <vector>

#define Nmax 30010
#define Mmax 100040

using namespace std;

vector <int> A[Nmax], B[Nmax];

int x, y, i, j, p, u, a, b, c, sol, n, m, sgn, ok;
int D[Nmax], coada[Nmax], viz[Nmax];

void BFS (int nod){
	
	p = 1;
	u = 2;
	coada[ p ] = nod;
	viz[nod] = 1;
	
	while (p <= u){
		
		if (ok == 100)
			break;
		
		for (i = 0 ; i < (int)A[ coada[p] ].size() ; i++)
			if (viz[A[coada[p]][i]] == 0){
				viz[A[coada[p]][i]] = 1;
				sgn = 1;
				coada[ u ] = A[ coada[p] ][ i ];
			
				if (coada[ p ] > A[ coada[ p ] ][ i ])
					sgn = -1;
				
				D[ u ] = D[ p ] + B[ coada[ p ] ][ i ]*sgn;
			
			
				if (A[ coada[p] ][ i ] == y){
					sol = D[u];
					ok = 100;
					break;
				}
			
				u++;
			}
		
		
		p++;
	}
	
	
}

int main (){
	
	FILE * f = fopen ("sate.in", "r");
	FILE * g = fopen ("sate.out", "w");
	
	fscanf (f, "%d %d %d %d", &n, &m, &x, &y);
	
	for (i = 1 ; i <= m ; i++){
		fscanf (f, "%d %d %d", &a, &b, &c);
		
		A[a].push_back(b);
		A[b].push_back(a);
		B[a].push_back(c);
		B[b].push_back(c);
		
	}
	
	BFS (x);
	
	fprintf (g, "%d", sol);
	
	fclose(g);
	fclose(f);
	return 0;
}