Cod sursa(job #1731917)

Utilizator edi4ever4Agarici Eduard edi4ever4 Data 20 iulie 2016 13:29:54
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#define inf  1000000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t;
struct nod
{ int info,cost;
 nod *urm;
};
void Addnod(nod *&q, int y , int z)
{ nod *p;
  p=new nod;
  p->info=y;
  p->cost=z;
  p->urm=q;
  q=p;
}
void Drumuri(int n,int m, int s, int g[50002])
{ int  i,j,viz[50002]={0},d[50002]={0},x,y,z,gata=0;
  nod *p[50002],*ta,*q;
  int min,nodd;
  for(i=1;i<=m;i++)
     {fin>>x>>y>>z;
      Addnod(p[x],y,z);
      Addnod(p[y],x,z);
     }
  for(i=1;i<=n;i++)
     if(i!=s) d[i]=inf;
    for(i=1;i<=n;i++)
     { min=inf;
        for(j=1;j<=n;j++)
            if(d[j]<min && viz[j]==0)
               {min=d[j];
                nodd=j;
               }
         viz[nodd]=1;
        ta=p[nodd];
        while(ta)
         { if(d[nodd]+ta->cost<d[ta->info])
              d[ta->info]=d[nodd]+ta->cost;
           ta=ta->urm;
         }
     }
 for(i=1;i<=n;i++)
    if(d[i]!=g[i]) {gata=1;break;}
 if(gata==1) fout<<"NU"<<"\n";
 else fout<<"DA"<<"\n";
 /*for(i=1;i<=n;i++)
     {q=p[i];
       while(q)
         { ta->urm=q->urm;
             delete q;
          q=ta->urm;
         }
     }*/
}
void Grafoni()
{ int i,n,m,s;
  int g[50002];
   fin>>n>>m>>s;
  for(i=1;i<=n;i++)
     fin>>g[i];
  Drumuri(n,m,s,g);
}
int main()
{ int i;
    fin>>t;
  for(i=1;i<=t;i++)
      Grafoni();
    return 0;
}