Pagini recente » Cod sursa (job #2407782) | Cod sursa (job #160662) | Cod sursa (job #2665545) | Cod sursa (job #116223) | Cod sursa (job #67691)
Cod sursa(job #67691)
#include <cstdio>
#define FIN "sate.in"
#define FOUT "sate.out"
#define MAX 7001
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;
bool visit[MAX];
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] = true;
for (u=p; p; dispose())
for (vecin=A[p->x]; vecin; vecin=vecin->next)
if ( !visit[vecin->x] ) {
push(vecin->x, p->c+vecin->c);
visit[vecin->x] = true;
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;
}