Cod sursa(job #1565807)

Utilizator DiClauDan Claudiu DiClau Data 11 ianuarie 2016 14:23:15
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
using namespace std;
const int N = 30005, M = 2 * 100030;
int lst[N], vf[M], urm[M], m, viz[N], ic, sf, cost[M];
struct coada
{
    int dif, nod;
};
coada c[N];
void adauga (int x, int y, int cost2)
{
    vf[++m] = y;
    cost[m] = cost2;
    urm[m] = lst[x];
    lst[x] = m;
}
int bfs (int dest)
{
    int y, p;
    viz[c[ic].nod] = true;
    p = lst[c[ic].nod];
    while (p != 0)
    {
        y = vf[p];
        if (viz[y] == false)
        {
            if (y < c[ic].nod)
                c[sf].dif = c[ic].dif - cost[p];
            else
                c[sf].dif = c[ic].dif + cost[p];
            c[sf++].nod = y;
            viz[y] = true;
            if (y == dest)
                return c[sf - 1].dif;
        }
            p = urm[p];
    }
    return -1;
}
int main ()
{
    FILE *in, *out;
    in = fopen ("sate.in", "r");
    out = fopen ("sate.out", "w");
    int n, m, start, dest;
    fscanf (in, "%d%d%d%d", &n, &m, &start, &dest);
    int i, x, y, cost2;
    for (i = 1; i <= m; i++)
    {
        fscanf (in, "%d%d%d", &x, &y, &cost2);
        adauga (x, y, cost2);
        adauga (y, x, cost2);
    }
    c[sf].nod = start;
    c[sf++].dif = 0;
    while (ic != sf)
    {
        x = bfs(dest);
        if (x != -1)
        {
            if (x > 0)
                fprintf (out, "%d", x);
            else
                fprintf (out, "%d", -x);
            return 0;
        }
        ic++;
    }
    return 0;
}