Cod sursa(job #2828465)

Utilizator rimihaiMihai Radu-Ioan rimihai Data 7 ianuarie 2022 13:43:06
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb

#include <bits/stdc++.h>

using namespace std;

#define INFINIT 0x3f3f3f3f

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

vector<pair<int,int>> g[50005];
bool viz[50005];
int d[50005];
int dist_verif[50005];

void dijkstra(int startNod)
{
    d[startNod]=0;
    priority_queue<pair<int,int>> q;
    q.push({0,startNod});
    while(!q.empty())
    {

        int nod=q.top().second;
        q.pop();
        if(viz[nod]==true) continue;
        else viz[nod]=true;
        for(auto vecin : g[nod])
        {
            if(d[nod]+vecin.second<d[vecin.first])
            {
                d[vecin.first]=d[nod]+vecin.second;
                q.push({-d[vecin.first],vecin.first});
            }
        }
    }
}

int main()
{
    int tests;
    fin>>tests;
    for(int tt=1; tt<=tests; tt++)
    {
        int n,m,start;
        fin>>n>>m>>start;
        for(int i=1; i<=n; i++)
        {
            fin>>dist_verif[i];
        }


        for(int i=1; i<=m; i++)
        {
            int a,b,cost;
            fin>>a>>b>>cost;
            g[a].push_back({b,cost});
        }

        for(int i=1; i<=n; i++)
            d[i]=INFINIT;

        dijkstra(start);

        bool ok=true;

        for(int i=1; i<=n; i++)
            if(d[i]!=dist_verif[i])
            {
                i=n;
                ok=false;
            }

        if(ok==true) fout<<"DA"<<'\n';
        else fout<<"NU";

        for(int x=1; x<=n; x++)
        {
            g[x].clear();
        }
        memset(viz,false,sizeof(viz));
        memset(d,0,sizeof(d));
        memset(dist_verif,0,sizeof(dist_verif));
    }
    return 0;
}