Cod sursa(job #1122616)

Utilizator Bigb21Avram Bogdan Bigb21 Data 25 februarie 2014 19:18:02
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
#include<cstdio>
#include<iostream>
#define INF=99999
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");

struct graf
{
     int nod,cost;
     graf *next;

};
graf *a[50001];
int d[50001],viz[50001],n,m,dnz[50001],s;

void add (int loc, int nodaferent,int cost)
{
    graf *q;
    q=new graf;
    q->nod=nodaferent;
    q->cost=cost;
    q->next=a[loc];
    a[loc]=q;

}

void read()
{
     int x,y,z;
     in>>n>>m>>s;
   for(int i=1; i<=n; i++)
        in>>dnz[i];

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

   }


}
void dijkstra (int nod)
{

     for(int i=2; i<=n; i++)
        { if(i!=nod)
              d[i]=999999;
          //  tata[i]=1;
          }
     int minim,k=0;
    for(int j=1; j<=n;j++)
        {  minim=999999;

      for(int i=1; i<=n; i++)
          if(minim>d[i]  && !viz[i])
          {
               minim=d[i];
               k=i;
          }

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

                   d[t->nod]=d[k]+t->cost;
                   // tata[t->nod]=k;

              t=t->next;
            }

}
}
int main ()
{  int T;
  bool ok;
 in>>T;
  for(int i=1; i<=T;i++)
  {
  ok=0;
      read();
      dijkstra(s);

      for(int i=1; i<=n; i++)
           viz[i]=0;
      for(int j=1; j<=n; j++)
        if(d[j]!=dnz[j])
            {ok=1;
              j=n+1;
            }
        if(ok)
            out<<"NU"<<'\n';
            else
                out<<"DA"<<'\n';

  }
}