Cod sursa(job #2099893)

Utilizator pibogaBogdan piboga Data 4 ianuarie 2018 20:00:39
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <cstdio>
#include <set>
#include <vector>
#define pb push_back
#define mkp make_pair
//long long ?

using namespace std;

const int NNOD=50001;
const int INF=100000001;
bool ok;
int ntes,ites,x,y,cost,inod,nnod,imuc,nmuc,sur,add,nodcrt,lgmuc,dnew;
int vdist[NNOD],vcalc[NNOD],veccrt;

vector < pair < int, int > > lst[NNOD];
vector < pair < int, int > >::iterator it;
set < pair < int, int > > squ;

int main()
{
    freopen ("distante.in","r",stdin);
    freopen ("distante.out","w",stdout);

    scanf ("%d",&ntes);

    for (ites=1; ites<=ntes; ++ites)
    {


        scanf ("%d%d%d",&nnod,&nmuc,&sur);

        for (inod=1; inod<=nnod; ++inod)
        {
            scanf("%d",&vcalc[inod]);
        }

        for (imuc=1; imuc<=nmuc; ++imuc)
        {
            scanf ("%d%d%d",&x,&y,&cost);
            lst[x].pb(mkp(cost,y));
            lst[y].pb(mkp(cost,x));
        }

        for (inod=1; inod<=nnod; ++inod)
        {
            vdist[inod]=INF;
        }
        vdist[sur]=0;
        squ.insert(mkp(0,sur));

        while (!squ.empty())
        {
            add=squ.begin()->first;
            nodcrt=squ.begin()->second;
            squ.erase(squ.begin());

            for (it=lst[nodcrt].begin();it!=lst[nodcrt].end();++it)
            {
                veccrt=it->second;
                lgmuc=it->first; //if (veccrt==nodcrt) continue;
                dnew=add+lgmuc;
                if (dnew<vdist[veccrt])
                {
                    if (vdist[veccrt]!=INF)
                        squ.erase(squ.find(mkp(vdist[veccrt],veccrt)));

                    squ.insert(mkp(dnew,veccrt));
                    vdist[veccrt]=dnew;
                }
            }
        }

        ok=1;
        for (inod=1;inod<=nnod;++inod)
        {
            if (vcalc[inod]!=vdist[inod])
            {
                ok=0;break;
            }
        }
        if (ok) printf ("DA");
        else printf ("NU");
        printf("\n");

        for (inod=1;inod<=nnod;++inod)
        {
            lst[inod].clear();
        }
    }


    return 0;
}