Cod sursa(job #294545)
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define pb push_back
#define tr(c, i) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
typedef pair<int, int> pii;
int N;
vector< vector<pii> > G;
int main(int argc, char *argv[]) {
int N, M, X, Y, u, v, w;
FILE *fi = fopen("sate.in", "r");
fscanf(fi, "%d %d %d %d", &N, &M, &X, &Y);
G.resize(N+1);
while (M--) {
fscanf(fi, "%d %d %d", &u, &v, &w);
G[u].pb(pii(v, w));
G[v].pb(pii(u, w));
}
fclose(fi);
vector<int> D(N+1, -1);
queue<int> Q;
Q.push(X);
D[X] = 0;
while (!Q.empty()) {
u = Q.front();
Q.pop();
tr(G[u], vv) {
v = vv->first;
w = vv->second;
if (D[v] == -1) {
if (v < u)
D[v] = D[u] - w;
else
D[v] = D[u] + w;
Q.push(v);
if (v == Y)
goto done;
}
}
}
done:
FILE *fo = fopen("sate.out", "w");
fprintf(fo, "%d\n", D[Y]);
fclose(fo);
return 0;
}