Cod sursa(job #1700738)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 11 mai 2016 07:42:58
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <cstring>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("sate.in");
ofstream g("sate.out");

const int mod = 45001;
char temp[3000];
int n, m, i, j, X, Y, x, y, c, l, semn, nr;
vector <int> ls[30005], lc[30005];
int d[30005], st, dr, coada[mod], nviz;
bool viz[30005];

int main()
{
    // Parsez citirea.

    f.getline(temp, sizeof(temp));
    l = strlen(temp);
    nviz = 0;
    semn = 1;
    for (i = 0; i < l;)
    {
        if (temp[i] == ' ')
            nviz++, i++;
        else if ((temp[i] >= '0' && temp[i] <= '9') || temp[i] == '-')
        {
            semn = 1, nr = 0;
            if (temp[i] == '-')
                semn = -1, i++;
            while (temp[i] >= '0' && temp[i] <= '9')
                nr = nr * 10 + temp[i] - '0', i++;

            if (nviz == 0) n = nr;
            else if (nviz == 1) m = nr;
            else if (nviz == 2) X = nr;
            else if (nviz == 3) Y = nr;
        }
    }

    for (;m;m--)
    {
        f.getline(temp, sizeof(temp));
        l = strlen(temp);
        nviz = 0;
        semn = 1;
        for (i = 0; i < l;)
        {
            if (temp[i] == ' ')
                nviz++, i++;
            else if ((temp[i] >= '0' && temp[i] <= '9') || temp[i] == '-')
            {
                semn = 1, nr = 0;
                if (temp[i] == '-')
                    semn = -1, i++;
                while (temp[i] >= '0' && temp[i] <= '9')
                    nr = nr * 10 + temp[i] - '0', i++;
                if (nviz == 0) x = nr;
                else if (nviz == 1) y = nr;
                else if (nviz == 2) c = nr;
            }
        }

        // Adaug in lista de adiacenta.

        ls[x].push_back(y);
        lc[x].push_back(c);
        ls[y].push_back(x);
        lc[y].push_back(c);
    }

    // Rezolv problema propriu-zisa.

    coada[0] = X;
    while (st <= dr)
    {
        x = coada[st%mod];
        st++;
        for (i = 0; i < ls[x].size(); i++)
        {
            y = ls[x][i];
            if (viz[y] == 0)
            {
                viz[y] = 1;
                if (y > x)
                    d[y] = d[x] + lc[x][i];
                else
                    d[y] = d[x] - lc[x][i];
                if (y == Y)
                {
                    g << d[y];
                    return 0;
                }
                dr++;
                coada[dr%mod] = y;
            }
        }

    }
    return 0;
}