Cod sursa(job #2666126)

Utilizator patriciaxdBraica Patricia patriciaxd Data 31 octombrie 2020 22:32:19
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<bits/stdc++.h>
///Problema Distante de pe Infoarena
using namespace std;
///Algoritmul Dijkstra-gasirea drumului minim
// Mod de rezolvare: Avem vectorul D[] unde D[i] reprezinta distanta minima
//dintre varful de start si i. Initializam toate distantele cu oo=(1<<30) adica 2^30.
// Parcurgem folosind un fel de bfs mai special-adica folosind:Coada de prioritate
long long D[50001];
long long D2[5001];
int oo=(1<<30);
ifstream in("distante.in");
ofstream out("distante.out");
struct compara
{ bool operator()(int x,int y)
  {
    return D[x]>D[y];
  }
};
///Avem conditia: Au prioritate elementele cu distanta cea mai mica,
/// adica cele cu D[i] mai mic vor iesi inainte decat cele cu D[i] mai mare

priority_queue< int, vector<int>, compara>Coada;
///Priority queue
///Primul parametru reprezinta tipul elementelor puse in coada
///Al doilea parametru este structura in care adunam toate obiectele din coada,
///in cazul nostru: un vector de int-uri
///Ultimul parametru (care este optional) este o functie ce returneaza TRUE sau FALSE
///in functie de interogarile noastre
vector < pair<int,int> >Muchii[50001];
int nr_grafuri,N,M,S;
bool Incoada[50001];//Ca sa nu le punem de mai multe ori verificam daca se afla in coada
bool verificare()
{ for(int i=1;i<=N;i++)
    {if(D[i]!=D2[i])
        return 0;}
    return 1;
}
void Dijkstra(int Nodstart)
{ for(int i=1;i<=N;i++)
    {D[i]=oo;
     Incoada[i]=false;//=0
    }
  Coada.push(Nodstart);
  D[Nodstart]=0;
  Incoada[Nodstart]=true;
  while(!Coada.empty())
  { int Nodcurent=Coada.top();
    Coada.pop();
    Incoada[Nodcurent]=false;
    for(size_t i=0;i<Muchii[Nodcurent].size();i++)
    { int Vecin=Muchii[Nodcurent][i].first;
      int Cost=Muchii[Nodcurent][i].second;
      if(D[Vecin]>D[Nodcurent]+Cost)
      { D[Vecin]=D[Nodcurent]+Cost;
        if(Incoada[Vecin]==false)
        { Coada.push(Vecin);
          Incoada[Vecin]=true;
        }
      }
    }
  }
  for(int i=1;i<=N;i++)
        {if(D[i]==oo)
         D[i]=0;
 D2[i]=0;
         }
}
int main()
{ in>>nr_grafuri;
  for(int i=1;i<=nr_grafuri;i++)
 {
     in>>N>>M>>S;//nodul de start
     for(int j=1;j<=N;j++)
        in>>D2[j];
     for(int j=1;j<=M;j++)
     { int x,y,c;//c-este costul
       in>>x>>y>>c;
       Muchii[x].push_back(make_pair(y,c));
       Muchii[y].push_back(make_pair(x,c));
     }
     Dijkstra(S);
     if(verificare())
     out<<"DA"<<'\n';
     else
      out<<"NU"<<'\n';
      for(int j=1;j<=N;j++)
        Muchii[j].clear();

 }
    return 0;
}