Cod sursa(job #1576262)

Utilizator edim98Eduard Constantinescu edim98 Data 22 ianuarie 2016 11:30:29
Problema Sate Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
#define NMAX 30001
#define MMAX 100025

using namespace std;

FILE *fin = fopen("sate.in", "r");
FILE *fout = fopen("sate.out", "w");

int n, m, in, sf;
int lst[NMAX], vf[2*MMAX], urm[2*MMAX], cost[2*MMAX];
int nr, Q[NMAX], dist[NMAX];
bool viz[NMAX];

void adaug(int x, int y, int c)
{
    nr++;
    vf[nr] = y;
    urm[nr] = lst[x];
    lst[x] = nr;
    cost[nr] = c;
}

void BFS()
{
    int prim = 0, ultim = 1;
    Q[++prim] = in;
    viz[in] = 1;
    int x, y, poz;
    while(prim <= ultim)
    {
        x = Q[prim];
        poz = lst[x];
        {
            while(poz != 0)
            {
                y = vf[poz];
                if(!viz[y])
                {
                    Q[++ultim] = y;
                    viz[y] = 1;
                    if(x < y)
                        dist[y] = dist[x] + cost[poz];
                    if(x > y)
                        dist[y] = dist[x] - cost[poz];
                }
                poz = urm[poz];
            }
            prim++;
        }
    }
    fprintf(fout, "%d\n", dist[sf]);
}

int main()
{

    fscanf(fin, "%d%d%d%d", &n, &m, &in, &sf);
    int x, y, c;
    for(int i = 0; i < n; i++)
    {
        fscanf(fin, "%d%d%d", &x, &y, &c);
        adaug(x, y, c);
        adaug(y, x, c);
    }
    BFS();
    return 0;
}