Pagini recente » Cod sursa (job #1326964) | Cod sursa (job #981453) | Cod sursa (job #2275978) | Cod sursa (job #2858447) | Cod sursa (job #559874)
Cod sursa(job #559874)
#include <vector>
#include <set>
#include <fstream>
using namespace std;
#define INF 0x3f3f3f3f
ifstream fin("distante.in");
ofstream fout("distante.out");
vector <vector<int> > G, C;
set<pair<int, int> > T;
int d[100];
int d1[100];
int n, m, s, t;
int flag;
void Read();
void Dijkstra(int nod);
int main()
{
Read();
fin.close();
fout.close();
return 0;
}
void Read()
{
fin >> t;
int x, y, cost;
while (t > 0)
{
memset(d, INF, sizeof(d));
flag = 0;
--t;
fin >> n >> m >> s;
G.resize(n+1);
C.resize(n+1);
for (int i = 1; i <= n; ++i)
fin >> d[i];
for (int i = 1; i <= m; ++i)
{
fin >> x >> y >> cost;
G[x].push_back(y);
C[x].push_back(cost);
G[y].push_back(x);
C[y].push_back(cost);
}
Dijkstra(s);
for (int i = 1; i <= m; ++i)
if (d[i] != d1[i])
{
flag = 1;
break;
}
if (flag == 1) fout << "NU\n";
else fout << "DA\n";
G.clear();
C.clear();
}
}
void Dijkstra(int nod)
{
memset(d1, INF, sizeof(d1));
int x, val;
d1[nod] = 0;
T.insert(make_pair(0, nod));
while (T.size() > 0)
{
x = (*T.begin()).second;
val = (*T.begin()).first;
T.erase((*T.begin()));
for (int i = 0; i < G[x].size(); ++i)
{
if (d1[G[x][i]] > d1[x] + C[x][i])
{
d1[G[x][i]] = d1[x] + C[x][i];
T.insert(make_pair(d[G[x][i]], G[x][i]));
}
}
}
}