Cod sursa(job #2367635)

Utilizator serban24Popovici Serban-Florin serban24 Data 5 martie 2019 11:45:31
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define cst first
#define nod second
#define INF 1000000000

using namespace std;

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

int t,n,m,k;
int solutie[50005];
int cost[50005];
int viz[50005];
vector < pair <int,int> > mv[50005];
priority_queue < pair <int,int>, vector < pair <int,int> >, greater < pair <int,int> > > pq;

void dijkstra(int p){
    int i,vecin;
    pair <int,int> x;

    cost[p]=0;
    pq.push(make_pair(0,p));

    while(!pq.empty()){
        x=pq.top();
        vecin=x.nod;
        pq.pop();

        if(viz[vecin])
            continue;

        viz[vecin]=1;

        for(i=0;i<mv[vecin].size();i++)
            if(cost[mv[vecin][i].nod]>mv[vecin][i].cst+cost[vecin]){
                cost[mv[vecin][i].nod]=mv[vecin][i].cst+cost[vecin];
                pq.push(make_pair(cost[mv[vecin][i].nod],mv[vecin][i].nod));
            }
    }
}

int main(){
    int i,x,y,c,j,ok;

    fin>>t;

    for(i=1;i<=t;i++){
        fin>>n>>m>>k;

        ok=1;

        for(auto j:mv)
            j.clear();

        for(j=1;j<=n;j++)
            fin>>solutie[j];

        for(j=1;j<=n;j++){
            cost[j]=INF;
            viz[j]=0;
        }

        for(j=1;j<=m;j++){
            fin>>x>>y>>c;
            mv[x].push_back(make_pair(c,y));
            mv[y].push_back(make_pair(c,x));
        }

        dijkstra(k);

        for(j=1;j<=n;j++)
            if(cost[j]!=solutie[j])
                ok=0;

        if(ok)
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }

    return 0;
}