Cod sursa(job #812738)

Utilizator SteveStefan Eniceicu Steve Data 14 noiembrie 2012 12:59:07
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <string>
#include <cstring>
#include <deque>
#include <stack>
#include <bitset>
#include <list>
#include <climits>

using namespace std;

#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define mp(a,b) make_pair (a, b)
#define ll long long

int N, M, X, Y;
vector <pair <int, int> > muchii[30011];
deque <pair <int, ll> > coada;
int atins[30011];

void Citire ()
{
    ifstream fin ("sate.in");
    fin >> N >> M >> X >> Y;
    for (int i = 0, a, b, D; i < M; i++)
    {
        fin >> a >> b >> D;
        muchii[a].pb (mp (b, 1LL * D));
        muchii[b].pb (mp (a, 1LL * -D));
    }
    fin.close ();
}

int BFS ()
{
    if (X == Y) return 0;
    coada.pb (mp (X, 0));
    atins[X] = 1;
    int a, b;
    while (!coada.empty ())
    {
        a = coada.front ().first;
        b = coada.front ().second;
        coada.pof ();
        for (int i = muchii[a].size () - 1; i >= 0; i--)
        {
            if (muchii[a][i].first == Y) return b + muchii[a][i].second;
            if (!atins[muchii[a][i].first])
            {
                atins[muchii[a][i].first] = 1;
                coada.pb (mp (muchii[a][i].first, b + muchii[a][i].second));
            }
        }
    }
    return -1;
}

void Scriere ()
{
    ofstream fout ("sate.out");
    fout << BFS ();
    fout.close ();
}

int main ()
{
    Citire ();
    Scriere ();
    return 0;
}