Cod sursa(job #1699764)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 8 mai 2016 15:12:20
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>

using namespace std;

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

const int mare = 500000000;
long long t, n, m, s, i, j, fin[50015];
long long drm[50015];
bool ok;


struct muchie
{
    int x, y, c;
};

muchie v[100015];

int main()
{
    f >> t;
    while (t)
    {
        f >> n >> m >> s;
        for (i = 1; i <= n; i++)
            f >> fin[i], drm[i] = 0;

        for (i = 1; i <= m; i++)
        {
            f >> v[i].x >> v[i].y >> v[i].c;
            if (v[i].x == s)
                drm[v[i].y] = v[i].c;
            else if (v[i].y == s)
                drm[v[i].x] = v[i].c;
        }

        for (i = 1; i <= n; i++)
            if (i != s && drm[i] == 0)
                drm[i] = mare;

        ok = 0;
        while (ok == 0)
        {
            ok = 1;
            for (i = 1; i <= m; i++)
            {
                if (drm[v[i].x] + v[i].c < drm[v[i].y])
                    drm[v[i].y] = drm[v[i].x] + v[i].c, ok = 0;
                if (drm[v[i].y] + v[i].c < drm[v[i].x])
                    drm[v[i].x] = drm[v[i].y] + v[i].c, ok = 0;
            }
            //g << 1;
        }

        ok = 1;


        for (i = 1; i <= n && ok; i++)
            if (drm[i] != fin[i])
                ok = 0;

        if (ok)
            g << "DA\n";
        else
            g << "NU\n";
        t--;
    }
    return 0;
}