Cod sursa(job #2275826)

Utilizator stefantagaTaga Stefan stefantaga Data 3 noiembrie 2018 17:33:35
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int mini[50002],verif[50002];
vector <pair <int,int> > v[50001];
priority_queue <pair <int,int> ,vector <pair <int,int> > ,greater <pair <int,int> > > h;
int t,n,m,inceput,i,j,x,y,cost,nod,sel[50005],c,ok1;
int main()
{
    f>>t;
    for (int yyi=1;yyi<=t;yyi++)
    {
        f>>n>>m>>inceput;
        for (j=1;j<=n;j++)
        {
            f>>verif[j];
        }
        for (i=1;i<=m;i++)
        {
            f>>x>>y>>cost;
            v[x].push_back({y,cost});
            v[y].push_back({x,cost});
        }
        for (j=1;j<=n;j++)
        {
            mini[j]=-1;
        }
        mini[inceput]=0;
        for (i=0;i<v[inceput].size();i++)
        {
            nod=v[inceput][i].first;
            mini[nod]=v[inceput][i].second;
            h.push({v[inceput][i].second,nod});
        }
        sel[inceput]=1;
        for (i=1;i<n;i++)
        {
            while (sel[h.top().second]==1)
            {
                h.pop();
            }
            c=h.top().second;
            h.pop();
            sel[c]=1;
            for (j=0;j<v[c].size();j++)
            {
                if (mini[v[c][j].first]==-1)
                {
                    mini[v[c][j].first]=mini[c]+v[c][j].second;
                    h.push({mini[v[c][j].first],v[c][j].first});
                }
                else
                if (mini[v[c][j].first]>mini[c]+v[c][j].second)
                {
                    mini[v[c][j].first]=mini[c]+v[c][j].second;
                    h.push({mini[v[c][j].first],v[c][j].first});
                }
            }
        }
        ok1=1;
        for (i=1;i<=n;i++)
        {
            if (mini[i]!=verif[i])
            {
                ok1=0;
                break;
            }
        }
        for (i=1;i<=n;i++)sel[i]=0;
        if (ok1==0)
        {
            g<<"NU"<<'\n';
        }
        else
        {
            g<<"DA"<<'\n';
        }
    }
    return 0;
}