Cod sursa(job #3180739)

Utilizator carpstefanCarp Stefan carpstefan Data 5 decembrie 2023 20:52:01
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
#define oo 2e9

using namespace std;

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

int n,m,s,T;
vector<pair<int,int>> L[100005];
priority_queue<pair<int,int>> q;
int dd[50005],d[50005],viz[50005];

void Reset()
{
    int i;
    for(i=1;i<=n;i++)
    {
        d[i]=oo;
        viz[i]=0;
        L[i].clear();
    }
}

void Dijkstra(int s)
{
    int k,cost,i;
    for(i=1;i<=n;i++)
    {
        viz[i]=0;
        d[i]=oo;
    }
    d[s]=0;
    q.push({0,s});
    while(!q.empty())
    {
        k=q.top().second;
        q.pop();
        if(viz[k]==0)
        {
            viz[k]=1;
            for(auto e:L[k])
            {
                i=e.first;
                cost=e.second;
                if(d[i]>d[k]+cost)
                {
                    d[i]=d[k]+cost;
                    q.push({-d[i],i});
                }
            }
        }
    }

    for(i=1;i<=n;i++)
        if(d[i]!=dd[i]) {fout<<"NU\n"; return;}
    fout<<"DA\n";
}

int main()
{
    int i,j,k,c;
    fin>>T;
    for(k=1;k<=T;k++)
    {
        fin>>n>>m>>s;
        for(i=1;i<=n;i++)
            fin>>dd[i];
        while(m--)
        {
            fin>>i>>j>>c;
            L[i].push_back({j,c});
            L[j].push_back({i,c});
        }
        Dijkstra(s);
        Reset();
    }
    fin.close();
    fout.close();
    return 0;
}