Cod sursa(job #771186)
#include <queue>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <climits>
#define INFILE "sate.in"
#define OUTFILE "sate.out"
#define NMax 32768
using namespace std;
int N, X, Y;
vector<int> Links[NMax], Distances[NMax];
int bfs()
{
int d, i, x, y;
queue<int> Queue;
vector<int> Visited(NMax, 0);
vector<int> Distance(NMax, 0);
Visited[X] = true;
Queue.push(X);
while (!Queue.empty())
{
d = Queue.front();
for (i = 0; i < Links[d].size(); ++i)
{
x = Links[d][i];
if (!Visited[x])
{
Distance[x] = Distance[d] + Distances[d][i];
if (x == Y)
{
return Distance[x];
}
Visited[x] = true;
Queue.push(x);
}
}
Queue.pop();
}
}
int main()
{
int x, y, d, i, M;
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
scanf("%d%d%d%d", &N, &M, &X, &Y);
while (M--)
{
scanf("%d%d%d", &x, &y, &d);
Links[x].push_back(y);
Links[y].push_back(x);
Distances[x].push_back(0 + d);
Distances[y].push_back(0 - d);
}
printf("%d\n", bfs());
return 0;
}