Pagini recente » Cod sursa (job #2758422) | Cod sursa (job #1341612) | Cod sursa (job #885311) | Cod sursa (job #1578756) | Cod sursa (job #67406)
Cod sursa(job #67406)
#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;
}