Cod sursa(job #2275835)

Utilizator stefantagaTaga Stefan stefantaga Data 3 noiembrie 2018 17:42:05
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 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,nr;
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;
        nr=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;
        nr=v[inceput].size();
        while (nr)
        {
            while (sel[h.top().second]==1)
            {
                h.pop();
            }
            c=h.top().second;
            h.pop();
            sel[c]=1;
            nr--;
            for (i=0;i<v[c].size();i++)
        {
            j=v[c][i].first;
            if (mini[j]==-1)
            {
                nr++;
                mini[j]=mini[c]+v[c][i].second;
                h.push({mini[j],j});
            }
            else
            if (mini[j]>mini[c]+v[c][i].second)
            {
                mini[j]=mini[c]+v[c][i].second;
                h.push(make_pair(mini[j],j));
            }
        }
        }
        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;mini[i]=-1;}
        while (!h.empty())h.pop();
        for (i=1;i<=n;i++)
        {
            while (!v[i].empty())
            {
                v[i].pop_back();
            }
        }
        if (ok1==0)
        {
            g<<"NU"<<'\n';
        }
        else
        {
            g<<"DA"<<'\n';
        }
    }
    return 0;
}