Cod sursa(job #2347525)

Utilizator andaraluca2001Anda Epure andaraluca2001 Data 18 februarie 2019 20:55:02
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

const int MAX=50007;
int t,n,m,s,x,y,c,dist[MAX],d[MAX],a,b,cost;
bool sel[MAX];
const int INF=2e5;

vector<pair<int ,int > >graf[MAX];

priority_queue<pair<int, int > >h;


void dijkstra(int start)
{
    for(int i=1;i<=n;i++)
    {
        d[i]=INF;
        sel[i]=false;

    }


    d[start]=0;
    h.push(make_pair(-d[start],start));

    while(!h.empty())
    {
        while(!h.empty() && sel[h.top().second]) h.pop();

        if(h.empty()) return;

        x=h.top().second;
        h.pop();
        sel[x]=true;

        for(int i=0;i<graf[x].size();i++)
        {
            pair<int , int >p=graf[x][i];
            y=p.second;
            c=p.first;

            if(d[x]+c<d[y])
            {
                d[y]=d[x]+c;
                h.push(make_pair(-d[y],y));

                            }
        }
    }
}
int main()
{
    in>>t;

    for(int i=1;i<=t;i++)
    {
        in>>n>>m>>s;

        for(int j=1;j<=n;j++) in>>dist[j];

        for(int j=1;j<=m;j++)
        {
            in>>a>>b>>cost;
            graf[a].push_back(make_pair(cost,b));

        }

        dijkstra(s);
        int ok=0;

        //for(int j=1;j<=n;j++) out<<d[j]<<" "<<dist[j]<<'\n';
        for(int j=1;j<=n;j++)
        {
            if(dist[j]!=d[j])
            {
                ok=1;
                break;
            }
        }

        if(ok==0)out<<"DA\n";
        else out<<"NU\n";

        for(int j=1;j<=n;j++) graf[j].clear();

    }
    return 0;
}