Cod sursa(job #396543)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 15 februarie 2010 15:44:01
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 30100
using namespace std;

struct mainType
{
	int nod, cost, igen;
}ob;

vector<mainType> v[NMAX];
int N, M, X, Y, i, j, costTot[NMAX];

void inFu(void)
{
	FILE *f = fopen("sate.in", "r");
	fscanf(f, "%d%d%d%d", &N, &M, &X, &Y);
	for(i = 1; i <= M; ++i)
	{
		int a, b, c;
		fscanf(f, "%d%d%d", &a, &b, &c);
		
		ob.nod = b, ob.cost = c, ob.igen = 1;
		v[a].push_back(ob);
		
		ob.nod = a,	ob.igen = -1;
		v[b].push_back(ob);
	
	}
	fclose(f);
}
void solve(void)
{
	queue<mainType> q;
	memset(costTot, 0, N * sizeof(int));
	
	ob.cost = 0;
	ob.nod = X;
	ob.igen = 1;
	q.push(ob);
	costTot[X] = 0;
	bool sw = 1;
	while(!q.empty() && sw)
	{
		mainType el = q.front();
		q.pop();
		for(int i = 0; i < v[el.nod].size() && sw; ++i)
		{
			int nod = el.nod, adiacNod = v[nod][i].nod;
			int precNod = nod;
			mainType adiac = v[nod][i];
			if((!costTot[adiacNod]) || (costTot[adiacNod] > costTot[precNod] + (adiac.cost * adiac.igen)))
			{
				q.push(v[nod][i]),
				costTot[adiacNod] = costTot[precNod] + (adiac.cost * adiac.igen);
				if(adiacNod == Y)
					sw = 0;
			}
		}
	}
}

void outFu(void)
{
	FILE *g = fopen("sate.out", "w");
	fprintf(g, "%d", costTot[Y]);
	fprintf(g, "\n");
	
	fclose(g);
}
int main(void)
{
	inFu();
	solve();
	outFu();
	
	return 0;
}