Pagini recente » Cod sursa (job #3348361) | Cod sursa (job #3345760) | Cod sursa (job #3300315) | Cod sursa (job #3304200) | Cod sursa (job #3327904)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
struct Muchie
{
int nodS;
int nodE;
int cost;
};
struct Nod
{
int distantaCalc;
vector<Muchie> muchii;
bool vizitat = false;
int distantaDijkstra = 0;
};
void RezTest()
{
int nrNoduri;
in >> nrNoduri;
int nrMuchii;
in >> nrMuchii;
int nodSursa;
in >> nodSursa;
nodSursa--;
vector<Nod> graf;
for(int i = 0; i < nrNoduri; i++)
{
Nod n;
in >> n.distantaCalc;
graf.push_back(n);
}
for(int i = 0; i < nrMuchii; i++)
{
Muchie mS;
in >> mS.nodS;
mS.nodS--;
in >> mS.nodE;
mS.nodE--;
in >> mS.cost;
graf[mS.nodS].muchii.push_back(mS);
Muchie mE;
mE.nodS = mS.nodE;
mE.nodE = mS.nodS;
mE.cost = mS.cost;
graf[mE.nodS].muchii.push_back(mE);
}
bool good = true;
set<pair<int, int> > st;
st.insert({ 0, nodSursa });
graf[nodSursa].vizitat = true;
graf[nodSursa].distantaDijkstra = 0;
if(graf[nodSursa].distantaCalc != graf[nodSursa].distantaDijkstra)
good = false;
while(!st.empty())
{
pair<int, int> nodCrt = *(st.begin());
st.erase(nodCrt);
for(int i = 0; i < graf[nodCrt.second].muchii.size(); i++)
{
int newNod = graf[nodCrt.second].muchii[i].nodE;
if(graf[newNod].vizitat)
continue;
graf[newNod].vizitat = true;
graf[newNod].distantaDijkstra = nodCrt.first + graf[nodCrt.second].muchii[i].cost;
st.insert({ graf[newNod].distantaDijkstra, newNod });
if(graf[newNod].distantaCalc != graf[newNod].distantaDijkstra)
{
good = false;
break;
}
}
if(!good)
break;
}
if(good)
out << "DA\n";
else
out << "NU\n";
}
int main()
{
int nrTeste;
in >> nrTeste;
for(int i = 0; i < nrTeste; i++)
{
RezTest();
}
return 0;
}