Pagini recente » Cod sursa (job #2157619) | Teoria jocurilor: numerele Sprague Grundy | Cod sursa (job #1167660) | Cod sursa (job #907008) | Cod sursa (job #362252)
Cod sursa(job #362252)
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define FIN "sate.in"
#define FOUT "sate.out"
#define N 30001
#define MAX 30
int m, x, y, n;
int a[N];
vector < pair < int, int > > v[N];
queue <int> q;
void read()
{
int i, a[3], j, nr;
char s[MAX];
freopen(FIN, "r", stdin);
scanf("%d%d", &n, &m);
scanf("%d%d\n", &a[0], &a[1]);
x = min(a[0], a[1]);
y = max(a[0], a[1]);
for (i = 1, nr = 0; i <= m; ++ i)
{
gets(s);
a[0] = a[1] = a[2] = 0;
for (j = 0, nr = 0 ; s[j] && s[j] != 13; ++ j)
{
if (s[j] == ' ')
++ nr;
else
a[nr] = a[nr] * 10 + (s[j] - '0');
}
v[a[0]].push_back(make_pair(a[1], a[2]));
v[a[1]].push_back(make_pair(a[0], a[2]));
scanf("\n");
}
}
inline int mod(int a)
{
return a > 0 ? a : -a;
}
void BFS()
{
int i, k, s;
q.push(x);
while (!q.empty())
{
s = q.front();
q.pop();
if (s == y)
break;
for (i = 0; i < v[s].size(); ++ i)
if (!a[v[s][i].first] && v[s][i].first != x)
{
if ((x <= s && s < v[s][i].first) || (x >= s && s > v[s][i].first))
a[v[s][i].first] = a[s] + v[s][i].second;
else
a[v[s][i].first] = mod(a[s] - v[s][i].second);
q.push(v[s][i].first);
}
}
}
int main()
{
freopen(FOUT, "w", stdout);
read();
BFS();
printf("%d\n", a[y]);
}