Cod sursa(job #1699890)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 8 mai 2016 19:19:39
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
// Dijkstra - leeeeennnnnnnnt
#include <fstream>
#include <vector>

using namespace std;

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

const int mod = 50002;
const int mare = 500000000;
long long t, n, m, s, i, j, fin[50015];
long long drm[50015], x, y, c;
int coada[mod], st, dr;
bool viz[50005];
bool ok;

vector <int> nd[50005];
vector <int> nc[50005];

int main()
{
    f >> t;
    while (t)
    {
        f >> n >> m >> s;
        for (i = 1; i <= n; i++)
            f >> fin[i];
        for (i = 1; i <= n; i++)
        {
            viz[i] = 0;
            nd[i].clear(), nc[i].clear();
            drm[i] = mare;
        }
        drm[s] = 0, viz[s] = 1;
        for (i = 1; i <= m; i++)
        {
            f >> x >> y >> c;
            nd[x].push_back(y);
            nd[y].push_back(x);
            nc[x].push_back(c);
            nc[y].push_back(c);
        }
        st = dr = 0;
        coada[0] = s;

        while (st <= dr)
        {
            x = coada[st%mod];
            for (i = 0; i < nc[x].size(); i++)
            {
                if (viz[nd[x][i]] == 0 || drm[ nd[x][i] ] > drm[x] + nc[x][i])
                {
                    drm[ nd[x][i] ] = drm[x] + nc[x][i];
                    viz[nd[x][i]] = 1;
                    dr++;
                    coada[dr%mod] = nd[x][i];
                }
            }
            st++;
        }

        ok = 1;
        for (i = 1; i <= n && ok; i++)
        {
            //g << drm[i] <<" ";
            if (drm[i] != fin[i])
                ok = 0;
        }

        if (ok)
            g << "DA\n";
        else
            g << "NU\n";

        t--;
    }
    return 0;
}