Pagini recente » Cod sursa (job #3162159) | Cod sursa (job #495502) | Cod sursa (job #103088) | Cod sursa (job #944898) | Cod sursa (job #2146125)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <cstring>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int INF = 0x3f3f3f3f;
const int NMAX = 50002;
int T;
void Read();
void Solve();
int main()
{
Read();
return 0;
}
void Read()
{
fin >> T; /// citim cate cazuri avem de rezolvat
for(int i = 1; i <= T; i++)
Solve();
}
void Solve()
{
int n,m,start;
int sablon[NMAX];
fin >> n >> m >> start; /// citim nr de noduri,muchii si vf de start
/// citim distantele sablon care trebuie verificate
for(int i = 1; i <= n; i++)
fin >> sablon[i];
vector < pair<int,int> > G[NMAX]; /// creem graful
for(int i = 1; i <= m; i++)
{
int from,to,cost;
fin >> from >> to >> cost;
G[from].push_back( make_pair(cost,to) );
G[to].push_back( make_pair(cost,from) );
}
///creem vectorul de dist si il initializam cu INF//
int dist[NMAX];
memset(dist, INF, sizeof dist);
///
dist[start] = 0;
set< pair<int,int> > heap;
heap.insert(make_pair(0,start)); /// creem heap-ul si introducem prima muchie
while(!heap.empty())
{
int d = heap.begin()->first;
int node = heap.begin()->second;
heap.erase(heap.begin());
///am extras urmatorul nod pt care se va calcula distanta minima
for(vector < pair<int,int> >::iterator it = G[node].begin(); it != G[node].end(); ++it)
{
int cost = it ->first;
int to = it ->second;
if(dist[to] > dist[node] + cost)
{
if(dist[to] != INF)
heap.erase(heap.find(make_pair(dist[to],to)));
/// daca distanta pana la nodul "to" e dif de INF o stergem deoarece am gasit o solutie mai optima
dist[to] = dist[node] + cost;
heap.insert(make_pair(dist[to],to));
/// actualizam solutia optima si o introducem in heap;
}
}
}
for(int i = 1; i <= n; i++)
if(dist[i] == INF)
dist[i] = 0;
int ok = 1;
for(int i = 1; i <= n; i++)
if(dist[i] != sablon[i])
{
ok = 0;
fout << "NU" << endl;
break;
}
if(ok)
fout << "DA" << endl;
}