Cod sursa(job #2690371)

Utilizator TheGodYatoBUGNAR CATALIN TheGodYato Data 23 decembrie 2020 19:28:26
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#define Nmax 50005
#include <queue>
#include <climits>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int d[Nmax];
bool ok[Nmax];
struct compara{
bool operator()(int x,int y)
{
    return d[x]>d[y];
}
};
priority_queue<int,vector<int>,compara>coada;
void dijkstra(int nod,vector<pair<int,int>>a[])
{
    coada.push(nod);
    d[nod]=0;
    ok[nod]=1;
    while(!coada.empty())
    {
        int current=coada.top();
        coada.pop();
        ok[current]=0;
        for(auto i : a[current])
           {
            int vecin=i.first;
            int cost = i.second;
            if(d[vecin]>d[current]+cost)
                {d[vecin]=d[current]+cost;
                if(!ok[vecin])
                {ok[vecin]=1;
                coada.push(vecin);}}
            }
    }
}
int main()
{
    int t;
    int i;
    fin>>t;
    for(i=1;i<=t;++i)
    {
        int n,m,start,j;
        bool oki=true;
        vector<pair<int,int>>a[Nmax];
        vector<int>v;
        fin>>n>>m>>start;
        for(j=1;j<=n;++j)
            {d[j]=INT_MAX;
            ok[j]=0;}
        for(j=1;j<=n;++j)
        {   int x;
            fin>>x;
            v.push_back(x);
        }
        for(j=1;j<=m;++j)
        {   int x,y,c;
            fin>>x>>y>>c;
            a[x].push_back({y,c});
            a[y].push_back({x,c});}
        dijkstra(start,a);

        for(j=1;j<=n;++j)
        {
            if(d[j]!=v[j-1]){fout<<"NU\n";oki=false;break;}
        }
        if(oki)fout<<"DA\n";
    }
    return 0;
}