Cod sursa(job #2539056)

Utilizator StanCatalinStanCatalin StanCatalin Data 5 februarie 2020 16:15:06
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

const int N = 36005;
const int M = 72005;
const int INF = (1<<30) - 1;

int n,m,nr,cst[2*M],vf[2*M],lst[2*M],urm[2*M],nrq[N],q[N+1],d[N],k,distante[N];
bool ok[N],inq[N],fort[N];
int catun[N],st,dr = -1,s,t;

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

void inc(int &x)
{
    x++;
    if (x == N+1)
    {
        x = 0;
    }
}

bool bf(int nod)
{
    int x,y,c;
    inc(dr);
    q[dr] = nod;
    inq[nod] = 1;
    nrq[nod]++;
    d[nod] = 0;
    while (dr != st-1)
    {
        x = q[st];
        inc(st);
        inq[x] = 0;
        for (int p=lst[x]; p != 0; p = urm[p])
        {
            y = vf[p];
            c = cst[p];
            if (d[x] + c < d[y])
            {
                d[y] = d[x] + c;
                if (!inq[y])
                {
                    inc(dr);
                    q[dr] = y;
                    inq[y] = 1;
                    nrq[y]++;

                }
            }
        }
    }
    return 1;
}

void Reseteaza()
{
    st = 0;
    dr = -1;
    memset(d,0,sizeof(d));
    memset(lst,0,sizeof(lst));
    memset(urm,0,sizeof(urm));
    memset(vf,0,sizeof(vf));
    memset(cst,0,sizeof(cst));
    memset(q,0,sizeof(q));
    memset(inq,0,sizeof(inq));
    memset(nrq,0,sizeof(nrq));
    nr = 0;
}

int main()
{
    in >> t;
    while (t--)
    {
        Reseteaza();
        in >> n >> m >> s;
        for (int i=1; i<=n; i++)
        {
            in >> distante[i];
            d[i] = INF;
        }
        for (int i=1,x,y,c; i<=m; i++)
        {
            in >> x >> y >> c;
            Adauga(x,y,c);
            Adauga(y,x,c);
        }
        bf(s);
        int ok = 1;
        for (int i=1; i<=n && ok == 1; i++)
        {
            ok = (d[i] == distante[i]);
        }
        if (ok  == 0)
        {
            out << "NU\n";
        }
        else out << "DA\n";
    }
    return 0;
}