Cod sursa(job #67406)

Utilizator fluffyDan-Leonard Crestez fluffy Data 24 iunie 2007 15:21:41
Problema Sate Scor Ascuns
Compilator cpp Status done
Runda Marime 1.65 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <exception>

using namespace std;

struct segment
{
    int a, b, d;

    segment(int a, int b, int d):
        a(a), b(b), d(d)
    {
    }

    static bool cmp_by_start(const segment &a, const segment &b)
    {
        return a.a > b.a;
    }
};

int n, x, y;
typedef vector<segment> segvector;
vector<segment> segments;

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

void read()
{
    int m;
    in >> n >> m >> x >> y;
    --x; --y;
    segments.reserve(m);
    for (int i = 0; i < m; ++i) {
        int a, b, d;
        in >> a >> b >> d;
        --a; --b;
        segments.push_back(segment(a, b, d));
        segments.push_back(segment(b, a, d));
    }
}

int solve()
{
    sort(segments.begin(), segments.end(), &segment::cmp_by_start);
    vector<int> dist(n, -1);
    queue<int> q;

    dist[x] = 0;
    q.push(x);

    while (!q.empty()) {
        int c = q.front();
        q.pop();
        if (c == y) {
            return dist[c];
        }
        vector<segment>::iterator it = lower_bound(segments.begin(), segments.end(),
                segment(c, 0, 0), &segment::cmp_by_start);
        while (it != segments.end() && it->a == c) {
            if (dist[it->b] == -1) {
                int d;
                if ((it->b - c) * (c - x) < 0) {
                    d = abs(dist[c] - it->d);
                } else {
                    d = abs(dist[c] + it->d);
                }
                dist[it->b] = d;
                q.push(it->b);
            }
            ++it;
        }
    }
    throw exception();
}

int main(void)
{
    read();
    out << solve();
    return 0;
}