Cod sursa(job #1457819)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 4 iulie 2015 15:28:25
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <iterator>
#include <queue>
#include <functional>
#include <utility>
#define INF 1000000005
#define MAX 150005

using namespace std;

ifstream fin("sate.in");
ofstream fout("sate.out");

vector<pair<int, int> > v[30001];
int dist[30001];
bool viz[30001];

void BFS(int start, int finish);

int main() {
	ios::sync_with_stdio(false);
	int n, m, i, s, f, x, y, c;

	fin >> n >> m >> s >> f;

	for (i = 0; i < m; ++i) {
		fin >> x >> y >> c;

		if (x < y) {
			v[x].push_back({ y, c });
			v[y].push_back({ x, -c });
		}
		else {
			v[y].push_back({ x, c });
			v[x].push_back({ y, -c });
		}
	}

	BFS(s, f);

	fout << dist[f];

	return 0;
}

void BFS(int start, int finish) {
	int i, last;
	pair<int, int> actual;
	queue<int> q;

	dist[start] = 0;
	viz[start] = true;
	q.push(start);
	while (!q.empty()) {
		last = q.front();
		q.pop();

		for (i = 0; i < v[last].size(); ++i) {
			actual = v[last][i];
			if (viz[actual.first] == false) {
				viz[actual.first] = true;
				dist[actual.first] = dist[last] + actual.second;
				q.push(actual.first);
			}
		}
	}
}