Cod sursa(job #2311177)

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

vector <pi> V[12][Dim];

struct cmp
{
    bool operator() (int x,int y)
    {
        if(Cost[t][x]>Cost[t][y]) return 1;
        else return 0;
    }
};

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

void Dijkstra()
{
    for(int i=1;i<=N;i++)  Cost[t][i]=MAX;

    Cost[t][S]=0;
    minheap.push(S);
    while(!minheap.empty())
    {
        int nod=minheap.top();
        minheap.pop();
        viz[t][nod]=1;
        for(unsigned int i=0;i<V[t][nod].size();i++)
        {
            int vecin=V[t][nod][i].first;
            int pay=V[t][nod][i].second;
            if(Cost[t][nod]+pay<Cost[t][vecin])
            {
                Cost[t][vecin]=Cost[t][nod]+pay;
                if(viz[t][vecin]==0)
                {
                    minheap.push(vecin);
                    viz[t][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[t][i];
        for(int i=1;i<=M;i++)
        {
            f>>a>>b>>c;
            V[t][a].push_back({b,c});
            V[t][b].push_back({a,c});
        }
        Dijkstra();
        bool ok=1;

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

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