Cod sursa(job #2729850)

Utilizator BogdanFarcasBogdan Farcas BogdanFarcas Data 25 martie 2021 15:03:32
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

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

const int N=5e4+5;

int n,m,x,y,cost,t,sursa;
int dist[N],ans[N];
bool inq[N];
vector< pair<int,int> >v[N];

struct cmp
{
    bool operator()(int x,int y)
    {
        return ans[x]>ans[y];
    }
};

priority_queue<int,vector<int>,cmp>q;

void dijkstra(int start)
{
    memset(ans,-1,sizeof(ans));
    ans[start]=0;
    q.push(start);
    inq[start]=true;
    while(!q.empty())
    {
        int nod=q.top();
        q.pop();
        inq[nod]=false;
        for(size_t i=0;i<v[nod].size();i++)
        {
            int el=v[nod][i].first;
            int cost=v[nod][i].second;
            if((cost+ans[nod]<ans[el])||(ans[el]==-1))
            {
                ans[el]=ans[nod]+cost;
                if(inq[el]==false)
                {
                    q.push(el);
                    inq[el]=true;
                }
            }
        }
    }
}

bool comp()
{
    for(int i=1;i<=n;i++)
    {
        if(ans[i]!=dist[i])
        {
            return false;
        }
    }
    return true;
}

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>sursa;
        for(int i=1;i<=n;i++)
        {
            cin>>dist[i];
        }
        for(int i=1;i<=m;i++)
        {
            cin>>x>>y>>cost;
            v[x].push_back(make_pair(y,cost));
            v[y].push_back(make_pair(x,cost));
        }
        dijkstra(sursa);
        if(comp())
        {
            cout<<"DA\n";
        }
        else cout<<"NU\n";
        for(int i=1;i<=n;i++)
        {
            v[i].clear();
        }
    }
    return 0;
}