Cod sursa(job #771188)
#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, P;
vector<int> Links[NMax], Distances[NMax];
char Line[128];
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();
}
}
inline bool isDigit(char c)
{
return '0' <= c && c <= '9';
}
void parse(int & p, int & v)
{
v = 0;
while (!isDigit(Line[p]))
{
++p;
}
while (isDigit(Line[p]))
{
v = v * 10 + Line[p] - '0';
++p;
}
}
int main()
{
int x, y, d, i, M;
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
gets(Line);
P = 0;
parse(P, N);
parse(P, M);
parse(P, X);
parse(P, Y);
while (M--)
{
gets(Line);
P = 0;
parse(P, x);
parse(P, y);
parse(P, 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;
}