Cod sursa(job #902198)

Utilizator Bigb21Avram Bogdan Bigb21 Data 1 martie 2013 13:13:12
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include<iostream>
#include<fstream>
#define NMAX  50002
#define inf 1 << 30
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
struct graf
{

     int nod,cost;
     graf* next ;


};
graf *a[NMAX];
int viz[NMAX],d[NMAX],dp[NMAX],n,m,k,T;
bool dijk(int s)
{
     int min=0,poz=0;
    for(int i=1; i<=n; i++)
       if(i!=s)
          d[i]=inf;

          for(int i=1; i<=n; ++i)
          {
              min=inf;
              for(int j=1; j<=n; ++j)
                  if(d[j]<min && !viz[j])
                  {
                       min=d[j];
                         poz=j;
                  }


                  viz[poz]=1;
                  graf*t=a[poz];
                  while(t)
                  {
                       if(d[t->nod]>d[poz]+t->cost)
                          d[t->nod]=d[poz]+t->cost;

                           t=t->next;
                  }


            }


                for(int i=1; i<=n; i++)
                           if(d[i]!=dp[i])
                             return 0;
                            return 1;

}
void add(int where,int what ,int cost )

{
    graf* t=new graf;
    t->nod=what;
    t->cost=cost;
    t->next=a[where];
    a[where]=t;

}
void read_solve ()
{   int s,x,y,z;
    in>>T;
    while(T>0)
    {
        in>>n>>m>>s;

          for(int i=1; i<=n; ++i)
              in>>dp[i];
         for(int i=1; i<=m; i++)
          {
               in>>x>>y>>z;
                add(x,y,z);

          }


      if(dijk(s)==1)
         out<<"DA"<<'\n';
         else
         out<<"NU"<<'\n';
         T--;
    }

}


int main ()
{
     read_solve();
     in.close();
     out.close();
     return 0;
}