Pagini recente » Cod sursa (job #1778074) | Cod sursa (job #964073) | Cod sursa (job #3261943) | Cod sursa (job #602275) | Cod sursa (job #2051384)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
const int oo=2000000000;
const int Nmax=50000;
int NrNoduri, NrMuchii, nrGrafuri, nodSursaGlobal;
int distanta[Nmax+5], vizitat[Nmax+5];
int distantaPresupusa[Nmax+5];
vector < pair < int, int > > listaVecini[Nmax+5];
void Read()
{
fin >> NrNoduri >> NrMuchii >> nodSursaGlobal;
for (int i=1; i<=NrNoduri; i++)
fin >> distantaPresupusa[i];
for (int i=1; i<=NrMuchii; i++)
{
int nod, vecin, cost;
fin >> nod >> vecin >> cost;
listaVecini[nod].push_back(make_pair(vecin, cost));
}
}
void Dijkstra(int nodSursaArgument)
{
int nodCurent, distMinima;
distanta[nodSursaArgument]=0;
for (int i=1; i<=NrNoduri; i++)
if (i!=nodSursaArgument)
distanta[i]=oo;
for (int i=1; i<=NrNoduri; i++)
vizitat[i]=0;
for (int k=1; k<NrNoduri; k++)
{
distMinima=oo;
for (int i=1; i<=NrNoduri; i++)
if (distanta[i]<distMinima && vizitat[i]==0)
distMinima=distanta[i], nodCurent=i;
vizitat[nodCurent]=1;
for (int i=0; i<(int)listaVecini[nodCurent].size(); i++)
{
int nodVecin=listaVecini[nodCurent][i].first;
int cost=listaVecini[nodCurent][i].second;
if (distanta[nodCurent]+cost<=distanta[nodVecin])
distanta[nodVecin]=distanta[nodCurent]+cost;
}
}
}
bool Verificare()
{
for (int i=1; i<=NrNoduri; i++)
if (distanta[i]!=distantaPresupusa[i])
return 0;
return 1;
}
void Print()
{
if (Verificare())
fout << "DA";
else fout << "NU";
fout << "\n";
}
int main()
{
fin >> nrGrafuri;
for (int i=1; i<=nrGrafuri; i++)
{
Read();
Dijkstra(nodSursaGlobal);
Print();
for (int i=1; i<=NrNoduri; i++)
listaVecini[i].clear();
}
fin.close();
fout.close();
return 0;
}