Cod sursa(job #1913460)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 8 martie 2017 12:55:22
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#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]);
}