Cod sursa(job #2462100)

Utilizator roberttrutaTruta Robert roberttruta Data 26 septembrie 2019 19:14:43
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <vector>
#include <set>
using namespace std;
vector< pair<int,int> > v[50005];
set< pair<int,int> > heap;
int T,n,m,s,i,r,OK,a,b,c,vecin,nod,cost,d[50005],rsp[50005];
const int inf=1000000000;
int main()
{
    ifstream f("distante.in");
    ofstream g("distante.out");

    f>>T;
    for(r=1;r<=T;r++)
    {
        f>>n>>m>>s;
        for(i=1;i<=n;i++)
        f>>rsp[i];
        for(i=1;i<=n;i++)
        d[i]=inf;
        d[s]=0;
        for(i=1;i<=m;i++)
        {
            f>>a>>b>>c;
            v[a].push_back(make_pair(b,c));
            v[b].push_back(make_pair(a,c));
            if(a==s)
            {
                d[b]=c;
                heap.insert(make_pair(c,b));
            }
            if(b==s)
            {
                d[a]=c;
                heap.insert(make_pair(c,a));
            }
        }

        while(!heap.empty())
        {
            cost=heap.begin()->first;
            nod=heap.begin()->second;
            heap.erase(heap.begin());
            for(i=0;i<v[nod].size();i++)
            {
                vecin=v[nod][i].first;
                c=v[nod][i].second;
                if(d[vecin]>d[nod]+c)
                {
                    d[vecin]=d[nod]+c;
                    heap.insert(make_pair(d[vecin],vecin));
                }
            }
        }
        for(i=1;i<=n;i++)
        if(d[i]!=rsp[i])
        {
            OK=1; break;
        }
        if(OK)
        g<<"NU"<<'\n';
        else
        g<<"DA"<<'\n';

        OK=0;
        heap.clear();
        for(i=1;i<=n;i++)
        v[i].clear();
    }



    return 0;
}