Cod sursa(job #1475237)

Utilizator LegionHagiu Stefan Legion Data 23 august 2015 18:03:12
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
bool cc(pair<int, int> a, pair<int, int> b)
{
	if (a.second > b.second)
	{
		return true;
	}
	return false;
}
int main()
{
	ifstream in("sate.in");
	ofstream out("sate.out");
	register int i, n, m, x, y,a,b,c;
	register int distmin[30001];
	vector<pair<int,int> > d[30001];
	vector<pair<int, int> > gramada;
	in >> n;
	in >> m;
	in >> x;
	in >> y;
	for (i = 1;i <= m;i++)
	{
		in >> a;
		in >> b;
		in >> c;
		d[a].push_back(make_pair(b, c));
		d[b].push_back(make_pair(a, -c));
	}
	for (i = 0;i < d[x].size();i++)
	{
		gramada.push_back(make_pair(d[x][i].first, d[x][i].second));
		push_heap(gramada.begin(), gramada.end(),cc);
	}
	for (i = 1;i <= n;i++)
	{
		distmin[i] = 2000000000;
	}
	while (!gramada.empty())
	{
		b = gramada[0].first;
		c = gramada[0].second;
		pop_heap(gramada.begin(), gramada.end(), cc);
		gramada.pop_back();
		if (distmin[b] > c)
		{
			distmin[b] = c;
			for (i = 0;i < d[b].size();i++)
			{
				if (distmin[d[b][i].first] > c + d[b][i].second)
				{
					gramada.push_back(make_pair(d[b][i].first, d[b][i].second + c));
					push_heap(gramada.begin(), gramada.end(), cc);
				}
			}
		}
	}
	out << distmin[y];
}