Cod sursa(job #2331497)

Utilizator BotzkiBotzki Botzki Data 29 ianuarie 2019 17:25:36
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50000;
const int INF=2000000000;
struct muchie
{
    int nod, cost;
    bool operator <(const muchie&a)const{
        return cost>a.cost;
    }
};
int dist[NMAX+5];
bitset <NMAX+5>viz;
int dist_originale[NMAX+5];
priority_queue <muchie>q;
vector <muchie>G[NMAX+5];
void Dijkstra(int sursa)
{
    muchie a, b;
   int i;
   viz[sursa]=1;
   a.nod=sursa;
   a.cost=0;
   dist[sursa]=0;
   q.push(a);
   while(!q.empty())
   {
       a=q.top();
       q.pop();
       if(a.cost>dist[a.nod])
        continue;
       else
       {
         for(i=0;i<G[a.nod].size();i++)
         {
             b.nod=G[a.nod][i].nod;
             b.cost=G[a.nod][i].cost;
             if(dist[a.nod]+b.cost<dist[b.nod])
             {
                 dist[b.nod]=dist[a.nod]+b.cost;
                 b.cost=dist[b.nod];
                 q.push(b);
             }
         }
       }
   }
}
int main()
{
    int n, i, m, s, x, t;
    muchie a;
    fin>>t;
    for(int j=1;j<=t;j++)
    {
      fin>>n>>m>>s;
      for(i=1;i<=n;i++)
      {
         fin>>dist_originale[i];
         dist[i]=INF;
         G[i].clear();
      }
      for(i=1;i<=m;i++)
      {
        fin>>x>>a.nod>>a.cost;
        G[x].push_back(a);
        int aux=x;
        x=a.nod;
        a.nod=aux;
        G[x].push_back(a);
      }
      Dijkstra(s);
      bool ok=1;
      for(i=1;i<=n;i++)
       {
         if(dist[i]!=dist_originale[i])
         {
            ok=0;
            break;
         }
       }
      if(ok==1)
        fout<<"DA"<<"\n";
      else
        fout<<"NU"<<"\n";
    }

    return 0;
}