Cod sursa(job #2841433)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 29 ianuarie 2022 18:32:45
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
#define nmax 50005
using namespace std;
string prob="distante";
ifstream in(prob+".in");
ofstream out(prob+".out");

int distver[nmax];
int dist[nmax];
vector<pair<int,int>> adj[nmax];

bool dij(int nod){
    set<pair<int,int>> s;
    s.insert({0,nod});
    while(!s.empty())
    {
        int n=s.begin()->second;
        s.erase(s.begin());
        if(dist[n]!=distver[n])return 0;
        for(auto p:adj[n])
        {
            int i=p.first;
            int j=p.second;
            if(dist[i]!=distver[i])
            {
                if(dist[i]!=INT_MAX)s.erase(s.find({dist[i],i}));
                dist[i]=dist[n]+j;
                s.insert({dist[i],i});
            }
        }
    }
    return 1;
}

void solve()
{
    int n,m,s;
    in>>n>>m>>s;
    for(int i=1;i<=n;i++)
    {
        dist[i]=INT_MAX;
        distver[i]=0;
        adj[i].clear();
    }
    for(int i=1;i<=n;i++)in>>distver[i];
    for(int i=0;i<m;i++)
    {
        int x,y,z;
        in>>x>>y>>z;
        adj[x].push_back({y,z});
        adj[y].push_back({x,z});
    }
    dist[s]=0;
    if(dij(s))
    {
        out<<"DA\n";
    }
    else
    {
        out<<"NU\n";
    }
}

int main()
{
    int t;
    in>>t;
    while(t--)solve();
}