Cod sursa(job #1731907)

Utilizator edi4ever4Agarici Eduard edi4ever4 Data 20 iulie 2016 13:15:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 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],*t;
  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;
        t=p[nodd];
        while(t)
         { if(d[nodd]+t->cost<d[t->info])
              d[t->info]=d[nodd]+t->cost;
           t=t->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";
}
void Grafoni()
{ int i,n,m,s,x,y,z;
  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,j;
    fin>>t;
  for(i=1;i<=t;i++)
      Grafoni();
    return 0;
}