Pagini recente » Cod sursa (job #2080329) | Cod sursa (job #1435261)
#include <fstream>
#include <vector>
#include <set>
#include <cstring>
#include <string>
#define Max_Value 0x3f3f3f3f
#define Max_Nodes 50010
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int T, N, M, S, My_Dist[Max_Nodes], His_Dist[Max_Nodes];
vector < pair < int, int > > V[Max_Nodes];
multiset < pair < int, int > > Heap;
string Sol;
void Read_Data();
void Initialization();
void Dijkstra();
void Reset_Vector(vector < pair < int, int > > []);
void Verif();
int main()
{
fin >> T;
while (T--)
{
Read_Data();
Initialization();
Dijkstra();
Verif();
fout << Sol;
}
return 0;
}
void Read_Data()
{
fin >> N >> M >> S;
for (int i = 1; i <= N; i++) {
fin >> His_Dist[i];
}
Reset_Vector(V);
for (int i = 1, x, y, c; i <= M; i++) {
fin >> x >> y >> c;
V[x].push_back( { y, c } );
V[y].push_back( { x, c } );
}
}
void Initialization()
{
memset(My_Dist, Max_Value, sizeof(My_Dist));
My_Dist[S] = 0;
Heap.insert( { 0, S } );
}
void Dijkstra()
{
while (!Heap.empty())
{
pair < int, int > nod = *Heap.begin();
Heap.erase(nod);
for (vector < pair < int, int > > :: iterator it = V[nod.second].begin(); it != V[nod.second].end(); it++)
{
if (My_Dist[nod.second] + it->second < My_Dist[it->first])
{
Heap.erase( { My_Dist[it->first], it->first } );
My_Dist[it->first] = My_Dist[nod.second] + it->second;
Heap.insert( { My_Dist[it->first], it->first } );
}
}
}
}
void Reset_Vector(vector < pair < int, int > > A[])
{
for (int i = 1; i <= N; i++) {
A[i].clear();
}
}
void Verif()
{
Sol = "DA\n";
for (int i = 1; i <= N; i++) {
if (My_Dist[i] != His_Dist[i]) {
Sol = "NU\n";
break;
}
}
}