Cod sursa(job #2565756)

Utilizator KataIsache Catalina Kata Data 2 martie 2020 16:37:40
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <vector>
#include <queue>
#define N 50005
#define INF 10000000
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");

priority_queue < pair <int,int>, vector<pair <int,int>  >, greater<pair <int,int> >  > Q;
vector <pair <int,int> > g[N];
void djk(int s);
int n;
int v[N],dist[N],uz[N];
int main()
{
    int t,m,s,i,x,y,c;
    fin>>t;
    while(t--)
    {
        fin>>n>>m>>s;
        for(i=1;i<=n;i++) fin>>v[i];
        for(i=1;i<=m;i++)
        {
            fin>>x>>y>>c;
            g[x].push_back({c,y});
            g[y].push_back({c,x});
        }
        djk(s);
        for(i=1;i<=n;i++)
        {
            if(dist[i]==INF)
                dist[i]=0;
            if(dist[i]!=v[i])
                break;
        }
        if(i>n) fout<<"DA"<<'\n';
        else fout<<"NU"<<'\n';
        for(i=1;i<=n;i++)
            uz[i]=0,g[i].clear();
    }
    return 0;
}

void djk(int s)
{
    int i,nod,cost;
    for(i=1;i<=n;i++)
        dist[i]=INF;
    dist[s]=0;
    for(i=0;i<g[s].size();i++)
        {
            dist[g[s][i].second]=g[s][i].first;
            Q.push(g[s][i]);
        }
    uz[s]=1;
    while(!Q.empty())
    {
        nod=Q.top().second;
        cost=Q.top().first;
        uz[nod]=1;
        Q.pop();
        for(i=0;i<g[nod].size();i++)
            if(!uz[g[nod][i].second])
                if(dist[g[nod][i].second]> dist[nod]+ g[nod][i].first)
                {
                    dist[g[nod][i].second]=dist[nod]+ g[nod][i].first;
                    Q.push({g[nod][i].second,dist[g[nod][i].second]});
                }
    }

}