Cod sursa(job #1504581)

Utilizator bpalaniciPalanici Bogdan bpalanici Data 17 octombrie 2015 22:02:02
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 30005;
const int M = 100030;
const int oo = 0x3f3f3f3f;

vector < pair <int, int> > graf[N];
int dist[N];
bitset <N> viz;
int n, m, start, finish;
char parser[105];

void bfs(int start)
{
    deque <int> coada;
    coada.push_back(start);
    viz[start] = true;
    dist[start] = 0;
    while (!coada.empty())
    {
        int nod = coada.front();
        coada.pop_front();
        for (const auto &it : graf[nod])
        if (!viz[it.first])
            if (dist[it.first] == oo || dist[it.first] > dist[nod] + it.second)
            dist[it.first] = dist[nod] + it.second,
            viz[it.first] = true,
            coada.push_back(it.first);
    }
    fout << dist[finish];
}

int main()
{
    fin >> n >> m >> start >> finish;
    fin.get();
    for (int i = 1, a, b, c; i <= m; i++)
    {
        a = b = c = 0;
        fin.getline(parser, 100);
        int i1 = 0;
        while (parser[i1] == ' ') i1++;
        for (; parser[i1] != ' '; i1++)
        a = a * 10 + (parser[i1] - '0');
        i1++;
        for (; parser[i1] != ' '; i1++)
        b = b * 10 + (parser[i1] - '0');
        i1++;
        for (; parser[i1]; i1++)
        c = c * 10 + (parser[i1] - '0');

        graf[a].push_back(make_pair(b, c));
        graf[b].push_back(make_pair(a, -c));
    }
    memset(dist, oo, sizeof dist);
    bfs(start);
    return 0;
}