Cod sursa(job #1570398)

Utilizator gabriel.badeaGabriel Badea gabriel.badea Data 16 ianuarie 2016 14:59:08
Problema Sate Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
#include<vector>
#include<iostream>
#include<queue>
#include <string.h>
using namespace std;

#pragma warning(push)
#pragma warning(disable: 4996)

#define NMAX 30005

vector<int> noduri[NMAX];
vector<bool> viz(NMAX);

vector<int> costuri(NMAX);
int **costuri_muchii;

int nr_noduri, nr_muchii, nod_start, nod_final;
int x, y, z;
int cost;

queue<int> coada;

void bfs(int nod)
{
	viz[nod] = true;

	if (nod == nod_final)
	{
		cost = costuri[nod];
	}

	int nr_vecini = noduri[nod].size();
	for (int i = 0; i < nr_vecini; ++i)
	{
		if (!viz[noduri[nod][i]])
		{
			coada.push(noduri[nod][i]);
			viz[noduri[nod][i]] = true;
			costuri[noduri[nod][i]] = costuri[nod] + costuri_muchii[nod][noduri[nod][i]];
		}
	}

	coada.pop();

	if (!coada.empty())
	{
		bfs(coada.front());
	}
}

int main()
{
	freopen("sate.in", "r", stdin);
	freopen("sate.out", "w", stdout);

	cin >> nr_noduri >> nr_muchii >> nod_start >> nod_final;

	costuri_muchii = new int*[nr_noduri];
	for (int i = 1; i <= nr_noduri; ++i) 
	{
		costuri_muchii[i] = new int[nr_noduri];
		memset(costuri_muchii[i], 0, sizeof costuri_muchii[i] * nr_noduri);
	}
		
	for (int i = 0; i < nr_muchii; ++i)
	{
		scanf("%d%d%d", &x, &y, &z);

		// adaugam vecinii, muchii bidirectionale
		noduri[x].push_back(y);
		noduri[y].push_back(x);

		// intr-un sens adunam cand mergem si in celalalt scadem
		costuri_muchii[x][y] = z;
		costuri_muchii[y][x] = -z;
	}

	coada.push(nod_start);

	bfs(nod_start);

	cout << cost;
	
	return 0;
}



#pragma warning(pop)