Cod sursa(job #2311213)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 2 ianuarie 2019 19:26:16
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>
#define Dim 50004
#define MAX 2000000009
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
typedef pair<int,int> pi;
int N,M,S,T,t,D[Dim],a,b,c;
int Cost[Dim];
bool viz[Dim];

vector <pi> V[Dim];

struct cmp
{
    bool operator() (int x,int y)
    {
        return (Cost[x]>Cost[y]);

    }
};

priority_queue < int,vector<int>,cmp > minheap;

void Dijkstra()
{
    for(int i=1;i<=Dim-4;i++)
        {
            Cost[i]=MAX;
            viz[i]=0;
        }

    Cost[S]=0;
    minheap.push(S);
    viz[S]=1;
    while(!minheap.empty())
    {
        int nod=minheap.top();
        minheap.pop();
        viz[nod]=1;
        for(unsigned int i=0;i<V[nod].size();i++)
        {
            int vecin=V[nod][i].first;
            int pay=V[nod][i].second;
            if(Cost[nod]+pay<Cost[vecin])
            {
                Cost[vecin]=Cost[nod]+pay;
                if(viz[vecin]==0)
                {
                    minheap.push(vecin);
                    viz[vecin]=1;
                }
            }
        }
    }
}

int main()
{
    f>>T;
    for(t=1;t<=T;t++)
    {
        f>>N>>M>>S;
        for(int i=1;i<=N;i++)
        {
            f>>D[i];
            V[i].clear();
        }
        for(int i=1;i<=M;i++)
        {
            f>>a>>b>>c;
            V[a].push_back({b,c});
            V[b].push_back({a,c});
        }
        Dijkstra();
        bool ok=1;

        for(int i=1;i<=N&&ok==1;i++)
            if(Cost[i]!=D[i]) ok=0;

        if(ok) g<<"DA"<<'\n';
        else g<<"NU"<<'\n';


    }
    return 0;
}