Pagini recente » Cod sursa (job #358320) | Cod sursa (job #2741029) | Cod sursa (job #889686) | Cod sursa (job #1519234) | Cod sursa (job #2908898)
#include <bits/stdc++.h>
using namespace std;
string fisier = "distante";
ifstream f(fisier+".in");
ofstream g(fisier+".out");
const int CMAX = 5e4+15;
const int oo = 2147483647;
int n, m, start, x, y, c;
int nr_graf;
int D[CMAX];
bool viz[CMAX];
bool ok = 0;
int distante[CMAX];
vector < pair < int, int > > graf[CMAX];
struct cmp
{
bool operator()(int x, int y)
{
return D[x] > D[y];
}
};
priority_queue < int, vector < int >, cmp > Q;
void dijkstra(vector < pair < int, int > > graf[], int start)
{
D[start] = 0;
viz[start] = 1;
Q.push(start);
while(!Q.empty() && ok==1)
{
int nod_curent = Q.top();
if(D[nod_curent]<distante[nod_curent])
{
ok = 0;
}
Q.pop();
for(int i=0; i<graf[nod_curent].size() && ok==1; i++)
{
int vecin = graf[nod_curent][i].first;
int cost = graf[nod_curent][i].second;
if(D[nod_curent]+cost<D[vecin])
{
D[vecin] = D[nod_curent] + cost;
Q.push(vecin);
}
}
}
while(!Q.empty())
Q.pop();
}
bool comparare(int D[], int distante[])
{
for(int i=1; i<=n; i++)
if(D[i]!=distante[i])
return false;
return true;
}
int main()
{
f >> nr_graf;
for(int temp=1; temp<=nr_graf; temp++)
{
f >> n >> m >> start;
for(int j=1; j<=n; j++)
{
f >> distante[j];
D[j] = oo;
viz[j] = 0;
graf[j].clear();
}
for(int j=1; j<=m; j++)
{
f >> x >> y >> c;
graf[x].push_back({y,c});
graf[y].push_back({x,c});
}
ok = 1;
dijkstra(graf,start);
if(comparare(D,distante)==false)
g << "NU" << '\n';
else
g << "DA" << '\n';
}
return 0;
}