Cod sursa(job #3203008)

Utilizator petric_mariaPetric Maria petric_maria Data 12 februarie 2024 21:07:27
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
//dijkstra de t ori
const int inf=1e9;
int t,n,m,i,j,h,s,a[50005],x,y,c,dist[50005],fr[50005];
vector< pair<int,int> >G[50005];
priority_queue< pair<int,int> > q;

void dijkstra(int k){

    for(int i=1;i<=n;++i) { dist[i]=inf; fr[i]=0; }
    q.push( make_pair(0,k) );
    dist[k]=0;
    while(!q.empty()){
        k=q.top().second;
        q.pop();
        if(fr[k]==0)
            for(auto i: G[k])
                if(dist[k] + i.second < dist[i.first]){
                    dist[i.first]=dist[k] + i.second;
                    q.push( make_pair(-1*dist[i.first] , i.first) );
                }
        fr[k]=1;
    }

}
int main()
{
    f>>t;
    for(h=1;h<=t;++h){
        f>>n>>m>>s;
        for(i=1;i<=n;++i) f>>a[i];
        for(i=1;i<=m;++i){
            f>>x>>y>>c;
            G[x].push_back( make_pair(y,c) );
            G[y].push_back( make_pair(x,c) );
        }

        dijkstra(s);
        bool ok=true;
        for(i=1;i<=n;++i)
            if(a[i]!=dist[i]) ok=false;
        if(ok) g<<"DA\n";
        else g<<"NU\n";
        for(i=1;i<=n;++i) G[i].clear();
    }
    return 0;
}