Pagini recente » Cod sursa (job #2211873) | Cod sursa (job #760434) | Cod sursa (job #1426051) | Cod sursa (job #1905858) | Cod sursa (job #1913460)
#include <cstdio>
#include <vector>
using namespace std;
const int mod = 80005;
vector<int> ls[30005], lc[30005];
int coada[mod], st,dr;
int n, m, x, y, i, j, c, l, inc, fin, nr;
bool incoada[30005];
int d[30005];
char s[100];
int main() {
freopen("sate.in","r",stdin);
freopen("sate.out","w",stdout);
scanf("%d %d %d %d\n", &n,&m,&inc,&fin);
for (i = 1; i <= n; i++)
d[i] = 20000005;
if (inc>fin) swap(inc,fin);
for (i = 1; i <= m; i++) {
gets(s);
j = nr = 0; while (s[j] >= '0') nr = nr*10+s[j++] - '0'; while (s[j] == ' ')j++; x = nr;
nr = 0; while (s[j] >= '0') nr = nr*10+s[j++] - '0';while (s[j] == ' ')j++; y = nr;
nr = 0; while (s[j] >= '0') nr = nr*10+s[j++] - '0';c = nr;
ls[x].push_back(y);
lc[x].push_back(c);
ls[y].push_back(x);
lc[y].push_back(-c);
}
coada[0] = inc;
incoada[inc] = 0;
d[inc] = 0;
while (st<=dr) {
x = coada[st%mod],st++;
incoada[x] = 0;
l = ls[x].size();
for (i = 0; i < l; i++) {
y = ls[x][i];
c = lc[x][i];
if (d[x] + c < d[y]) {
d[y] = d[x]+c;
if (incoada[y])
continue;
incoada[y] = 1;
dr++,coada[dr%mod] = y;
}
}
}
printf("%d",d[fin]);
}