Cod sursa(job #2488781)

Utilizator dragossofiaSofia Dragos dragossofia Data 7 noiembrie 2019 17:06:57
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define nmax 50001
#define inf (1<<30)
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
typedef pair< int , int> ipair ;
int n,m,s,nr;
int ok[nmax];
int d[nmax];

void Dijkstra ( int start , vector <int> Ad[] , vector<int> Cost[] )
{
    priority_queue <  ipair , vector < ipair > , greater <ipair> > pq;

    int i,nod,v;

    for( i = 1 ; i <= n ; i ++)
         d[i] = inf;
    d[start]=0;

    pq.push( make_pair ( 0 , start) );

    while ( !pq.empty() )
    {
      nod = pq.top().second;

      pq.pop();

      for( i = 0 ; i < Ad[nod].size() ; i++)
        {
         v=Ad[nod][i];

         if(d[v] > d[nod] + Cost[nod][i])
            {
             d[v] = d[nod] + Cost [nod][i];

             pq.push(make_pair(d[v], v));
            }

        }
    }
}

void rezolva()
{
 vector <int> Ad[nmax];
 vector <int> Cost[nmax];
 int i,c,x,y;
 fin>>n>>m>>s;
 for( i = 1 ; i <= n ; i++)
    fin>>ok[i];

 for( i = 1 ; i <= m ; i++)
    {fin>>x>>y>>c;

     Ad[x].push_back(y);
     Cost[x].push_back(c);

     Ad[y].push_back(x);
     Cost[y].push_back(c);

    }

 Dijkstra(s,Ad,Cost);

 for( i = 1 ; i <= n ; i++)
    if( ok[i] != d[i])
        {fout<<"NU"<<"\n";
         return;
        }
fout<<"DA"<<"\n";
}

int main()
{
    fin>>nr;
    for(int i=1 ; i<=nr ; i++)
        {rezolva();

        }

    return 0;
}