Pagini recente » Cod sursa (job #563216) | Cod sursa (job #2674419) | Cod sursa (job #680286) | Cod sursa (job #1410595) | Cod sursa (job #2554804)
#include <iostream>
#include <cstdio>
#define NMAX 30000
using namespace std;
struct vecin {
int sat, dist;
} st[NMAX + 5], dr[NMAX + 5];
int n, m, x, y;
void update_dr(int sat1, int sat2, int dist) {
int auxs, auxd;
while(dist)
if(dist > dr[sat1].dist) {
if(dr[sat1].dist == 0) {
dr[sat1].dist = dist;
dr[sat1].sat = sat2;
st[sat2].dist = dist;
st[sat2].sat = sat1;
}
else {
dist -= dr[sat1].dist;
sat1 = dr[sat1].sat;
}
}
else {
auxs = dr[sat1].sat;
auxd = dr[sat1].dist;
dr[sat1].sat = sat2;
dr[sat1].dist = dist;
st[sat2].sat = sat1;
st[sat2].dist = dist;
sat1 = sat2;
dist = auxd - dist;
sat2 = auxs;
}
}
void update_st(int sat1, int sat2, int dist) {
int auxs, auxd;
while(dist)
if(dist > st[sat1].dist) {
if(st[sat1].dist == 0) {
st[sat1].dist = dist;
st[sat1].sat = sat2;
dr[sat2].dist = dist;
dr[sat2].sat = sat1;
}
else {
dist -= st[sat1].dist;
sat1 = st[sat1].sat;
}
}
else {
auxs = st[sat1].sat;
auxd = st[sat1].dist;
st[sat1].sat = sat2;
st[sat1].dist = dist;
dr[sat2].sat = sat1;
dr[sat2].dist = dist;
sat1 = sat2;
dist = auxd - dist;
sat2 = auxs;
}
}
int main() {
freopen("sate.in", "r", stdin);
freopen("sate.out", "w", stdout);
int a, b, d, auxs, auxd;
scanf("%d %d %d %d", &n, &m, &x, &y);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d", &a, &b, &d);
auxs = st[b].sat;
auxd = st[b].dist;
update_dr(a, b, d);
update_st(b, auxs, auxd);
}
auxd = 0;
auxs = x;
while(auxs != y) {
auxd += dr[auxs].dist;
auxs = dr[auxs].sat;
}
printf("%d", auxd);
return 0;
}