Cod sursa(job #2208920)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 1 iunie 2018 11:34:17
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <queue>
#define NMAX 100000

using namespace std;

int n, m, nr, lst[1 + NMAX], urm[1 + 2 * NMAX], viz[1 + 2 * NMAX], s, f, dist;

struct M {
    int p, d;
};

M vf[1 + 2 * NMAX];

queue <M> a;
void adauga ( int x, int y, int d ) {
    ++nr;
    vf[nr].p = y;
    vf[nr].d = d;
    urm[nr] = lst[x];
    lst[x] = nr;
}

void bfs ( ) {
    while ( a.front().p != f ) {
        M x = a.front();
        a.pop();
        int p = lst[x.p];
        M y;
        while ( p ) {
            y = vf[p];
            if ( !viz[y.p] ) {
                a.push ( y );
                if ( y.p < x.p && dist - y.d > 0 )
                    dist -= y.d;
                else if ( y.p > x.p )
                    dist += y.d;
                viz[y.p] = 1;
            }

            p = urm[p];
        }
    }
}

int main() {
    FILE *fin = fopen ( "sate.in", "r" );
    fscanf ( fin, "%d%d%d%d", &n, &m, &s, &f );
    int i, x, y, d;
    for ( i = 1; i <= m; ++i ) {
        fscanf ( fin, "%d%d%d", &x, &y, &d );
        adauga ( y, x, d );
        adauga ( x, y, d );
    }
    fclose ( fin );
    a.push((M) {s, 0});

    bfs();

    FILE *fout = fopen ( "sate.out", "w" );
    fprintf ( fout, "%d", dist );
    fclose ( fout );

    return 0;
}