Cod sursa(job #2450374)

Utilizator Andy_ANDYSlatinaru Andrei Alexandru Andy_ANDY Data 22 august 2019 23:32:33
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb

#include <bits/stdc++.h>
using namespace std;
ifstream f ( "distante.in" );
ofstream g ( "distante.out" );
vector < pair< int,int > >  v[50005];
set < pair < int, int  >  > s ;
vector < int > date(50005),rasp(50005);
vector < bool >viz(50005);
void parcurgere(int nod)
{
    viz[nod]=1;
    for(int i=0; i<v[nod].size(); i++)
    {
        int vecin=v[nod][i].first;
        int cost=v[nod][i].second;
        if(!viz[vecin])
        {
            viz[vecin]=1;
            rasp[vecin]=rasp[nod]+cost;
            s.insert({rasp[vecin],vecin});
        }
        else
        {
            if(rasp[nod]+cost<rasp[vecin])
            {
                s.erase({rasp[vecin],vecin});
                rasp[vecin]=rasp[nod]+cost;
                s.insert({rasp[vecin],vecin});
            }
        }
    }
}

int main()
{
    int t;
    f>>t;
    while(t--)
    {
        int n,m,p;
        f>>n>>m>>p;
        for(int i=1; i<=n; i++)
            f>>date[i];
        for(int i=1,a,b,c; i<=m; i++)
        {
            f>>a>>b>>c;
            v[a].push_back({b,c});
            v[b].push_back({a,c});
        }
        rasp[p]=0;
        if(rasp[p]==date[p])
        {
            s.insert({0,p});
            while(!s.empty())
            {
                int nod=(*s.begin()).second;
                s.erase(s.begin());
                parcurgere(nod);
            }
            bool ok=1;
            for(int i=1; i<=n and ok; i++)
                if(rasp[i]!=date[i])
                    ok=0;
            if(ok)
                g<< "DA\n";
            else
                g<< "NU\n";

        }
        else g<< "NU\n";
        for(int i=1; i<=n; i++)
        {   v[i].clear();
            rasp[i]=0;
            date[i]=0;
            viz[i]=0;
        }
    }
    return 0;
}