Pagini recente » Cod sursa (job #2227954) | Cod sursa (job #1812909) | Cod sursa (job #2011375) | Cod sursa (job #1105261) | Cod sursa (job #67741)
Cod sursa(job #67741)
#include <stdio.h>
#include <stdlib.h>
#include <map>
using namespace std;
#define FIN "sate.in"
#define FOUT "sate.out"
#define MAXN 30001
#define MAXM 100100
int n, m, x, y;
int Used[MAXM];
map <pair<int, int>, int> ete;
struct elem { int x, c; elem *r; } * L[MAXN];
void push(int a, int b, int c)
{
elem *temp = new elem;
temp->x = b; temp->c = c; temp->r = L[a];
L[a] = temp;
}
void citire()
{
int i, a, b, c;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d%d%d%d", &n, &m, &x, &y);
for (i=0; i<m; ++i) {
scanf("%d %d %d", &a, &b, &c);
push(a, b, c);
push(b, a, -c);
ete[make_pair(a, b)] = i;
ete[make_pair(b, a)] = i;
}
}
long long dist = 0;
struct ceva { int s; elem *p; } S[MAXM*5]; // well teoretic e *2 dar ..
int t = -1;
void fixme(int s)
{
S[++t] = (ceva) { x, L[s] };
while (S[t].s != y && t >= 0) {
if (S[t].p) {
if (t && Used[ete[make_pair(S[t].p->x, S[t].s)]] ) {
S[t].p = S[t].p->r;
continue;
}
//fprintf(stderr, "%d => %d (%d)\n", S[t].s, S[t].p->x, S[t].p->c);
Used[ete[make_pair(S[t].p->x, S[t].s)]] = 1;
dist += S[t].p->c;
// merg mai departe...
S[t+1] = (ceva) { S[t].p->x, L[ S[t].p->x ] }; ++t;
continue;
}
// ne intoarcem ...
--t;
dist -= S[t].p->c;
Used[ete[make_pair(S[t+1].s, S[t].s)]] = 0; S[t].p = S[t].p->r;
}
printf("%lld\n", dist);
}
int main()
{
citire();
fixme(x);
return 0;
}