Pagini recente » Cod sursa (job #214449) | Cod sursa (job #1903015) | Cod sursa (job #1937704) | Cod sursa (job #581900) | Cod sursa (job #92791)
Cod sursa(job #92791)
#include <cstdio>
#include <vector>
using namespace std;
#define INF 666000666
#define NMAX 30030
#define QMAX ((1<<18)-1)
#define pb push_back
#define f(x) (x=(x+1)&QMAX)
vector<int> A[NMAX], C[NMAX];
int N, M, X, Y, hi, Dist[NMAX], Q[QMAX+10];
void read()
{
int d, i, j, k;
freopen("sate.in", "r", stdin);
scanf("%d%d%d%d", &N, &M, &X, &Y);
for (k = 0; k < M; k++)
{
scanf("%d%d%d", &i, &j, &d);
A[i].pb(j); A[j].pb(i); C[i].pb(d); C[j].pb(d);
if (i==X) { Q[hi] = j; f(hi); }
if (j==X) { Q[hi] = i; f(hi); }
}
}
void solve()
{
int i, j, d, f, lo, n;
for (i = 0; i < NMAX; i++) Dist[i] = INF;
Dist[X] = 0;
for (n = A[X].size(), i = 0; i < n; i++)
Dist[ A[X][i] ] = C[X][i];
freopen("sate.out", "w", stdout);
for (lo = 0; lo < hi; lo++)
{
i = Q[lo];
for (n = A[i].size(), j = 0; j < n; j++)
{
f = A[i][j]; d = C[i][j];
if (Dist[f]==INF)
{
//case 1
if ( (X < i && i < f) || (X > i && i > f) ) Dist[f] = Dist[i]+d;
//case 2
if ( (X < f && f < i) || (X > f && f > i) ) Dist[f] = Dist[i]-d;
//case 3
if ( (f < X && X < i) || (i < X && X < f) ) Dist[f] = d-Dist[i];
Q[hi] = f; f(hi);
if (f==Y)
{ printf("%d\n", Dist[f]); exit(0); }
}
}
}
}
int main()
{
read();
solve();
return 0;
}