Pagini recente » Cod sursa (job #2426306) | Cod sursa (job #1140296) | Cod sursa (job #753866) | Cod sursa (job #1886860) | Cod sursa (job #67708)
Cod sursa(job #67708)
#include <cstdio>
#define FIN "sate.in"
#define FOUT "sate.out"
#define MAX 30001
struct LISTA {
long x,c;
LISTA *next;
} *A[MAX];
void add(long x, long y, long c) {
LISTA *tmp = new LISTA;
tmp -> x = y;
tmp -> c = c;
tmp -> next = A[x];
A[x] = tmp;
}
long S, F, n, m, length;
char visit[MAX/8+1];
LISTA *p, *u;
void push(long x, long c) {
LISTA *tmp = new LISTA;
tmp -> x = x;
tmp -> c = c;
tmp -> next = 0;
u -> next = tmp;
u = tmp;
}
void dispose() {
LISTA *t = p;
p = p->next;
delete t;
}
void bf() {
LISTA *vecin;
p = new LISTA;
p -> x = S; p -> c = 0;
visit[S/8] |= 1<<(S&7);
for (u=p; p; dispose())
for (vecin=A[p->x]; vecin; vecin=vecin->next)
if ( !(visit[vecin->x/8]&(1<<(vecin->x&7))) ) {
push(vecin->x, p->c+vecin->c);
visit[vecin->x/8] |= 1<<(vecin->x&7);
if ( vecin->x == F ) {
length = u->c;
return;
}
}
}
int main() {
long i, x, y, z;
freopen(FIN, "r", stdin);
scanf("%ld %ld %ld %ld", &n, &m, &S, &F);
for (i=0; i<n; ++i) {
scanf("%ld %ld %ld", &x, &y, &z);
add(x,y,z);
add(y,x,-z);
}
fclose(stdin);
length = -1;
if ( S>F ) {
long aux = S;
S = F; F = aux;
}
bf();
freopen(FOUT, "w", stdout);
printf("%ld\n", length);
fclose(stdout);
return 0;
}