Cod sursa(job #2575768)

Utilizator luisavluisa v luisav Data 6 martie 2020 15:20:46
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
vector<pair<int,int> >v[50001];
int n,m,p,i;
int dp[50001];
int d[50001];
const int inf=100000001;
bool viz[50001];

struct cmp{
 bool operator()(int a,int b){
 return d[a]>d[b];
 }

};
priority_queue<int,vector<int>,cmp>coada;
void dijkstra(int p){

for(int k=1;k<=n;k++)d[k]=inf;
d[p]=0;
viz[p]=1;
coada.push(p);
while(!coada.empty()){

    int nod=coada.top();
    coada.pop();
    viz[nod]=0;
    for(int k=0;k<v[nod].size();k++)
    {
        int vecin=v[nod][k].first;
        int cost=v[nod][k].second;

        if(d[vecin]>d[nod]+cost){

            d[vecin]=d[nod]+cost;

            if(viz[vecin]==0){
                viz[vecin]=1;
                coada.push(vecin);
            }
        }
    }
}
}
int main()
{

   int nrgrf;
   in>>nrgrf;

   for(i=1;i<=nrgrf;i++){


    in>>n>>m>>p;

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




    for(int j=1;j<=m;j++){
            int x,y,c;
        in>>x>>y>>c;
        v[x].push_back({y,c});
        v[y].push_back({x,c});
    }

    dijkstra(p);
 for(int j=1;j<=n;j++)
    {
        while(v[j].size()>0)v[j].pop_back();
    }




    int t=1;
    for(int k=1;k<=n&&t;k++)if(dp[k]!=d[k])t=0;



    if(t==1)out<<"DA"<<'\n';
    else out<<"NU"<<'\n';
   }
    return 0;
}