Pagini recente » Cod sursa (job #1561333) | Cod sursa (job #2284502) | Cod sursa (job #1768914) | Cod sursa (job #772645) | Cod sursa (job #1646708)
//http://www.infoarena.ro/problema/distante
#include <iostream>
#include <fstream>
#include <climits>
#include <set>
#include <vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define MAXN 50010
int n, S, d[MAXN], V[MAXN];
//vector <int> G[MAXN], C[MAXN], V;
vector < pair <int,int> > G[MAXN];
set < pair <int, int> > T;
void Read()
{
int m, x, y, c;
f >> n >> m >> S;
for(int i = 1; i <= n; i++)
f >> V[i];
for(int i = 1; i <= m; i++)
f >> x >> y >> c, G[x].push_back(make_pair(y, c)), G[y].push_back(make_pair(x, c));
}
void Dijkstra()
{
int val, x;
for(int i = 1; i <= n; i++)
d[i] = INT_MAX;
d[S] = 0;
T.insert(make_pair(0, S));
while(T.size() > 0)
{
val = (*T.begin()).first; x = (*T.begin()).second;
T.erase(*T.begin());
for(unsigned int i = 0; i < G[x].size(); i++)
if(d[ G[x][i].first ] > val + G[x][i].second)
d[ G[x][i].first ] = val + G[x][i].second, T.insert(make_pair(d[ G[x][i].first ], G[x][i].first));
}
}
int Verify()
{
for(int i = 1; i <= n; i++)
if(d[i] == INT_MAX)
d[i] = 0;
for(int i = 1; i <= n; i++)
if(d[i] != V[i])
return 0;
return 1;
}
int main()
{
short gr;
f >> gr;
for(int i = 1; i <= gr; i++)
{
Read();
Dijkstra();
if(Verify()) g << "DA\n";
else g << "NU\n";
for(int i = 1; i <= n; i++){
while(G[i].size()) G[i].pop_back();
}
}
}