Pagini recente » Cod sursa (job #2137321) | Cod sursa (job #1387065) | Cod sursa (job #2371009) | Cod sursa (job #1294333) | Cod sursa (job #1699890)
// Dijkstra - leeeeennnnnnnnt
#include <fstream>
#include <vector>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int mod = 50002;
const int mare = 500000000;
long long t, n, m, s, i, j, fin[50015];
long long drm[50015], x, y, c;
int coada[mod], st, dr;
bool viz[50005];
bool ok;
vector <int> nd[50005];
vector <int> nc[50005];
int main()
{
f >> t;
while (t)
{
f >> n >> m >> s;
for (i = 1; i <= n; i++)
f >> fin[i];
for (i = 1; i <= n; i++)
{
viz[i] = 0;
nd[i].clear(), nc[i].clear();
drm[i] = mare;
}
drm[s] = 0, viz[s] = 1;
for (i = 1; i <= m; i++)
{
f >> x >> y >> c;
nd[x].push_back(y);
nd[y].push_back(x);
nc[x].push_back(c);
nc[y].push_back(c);
}
st = dr = 0;
coada[0] = s;
while (st <= dr)
{
x = coada[st%mod];
for (i = 0; i < nc[x].size(); i++)
{
if (viz[nd[x][i]] == 0 || drm[ nd[x][i] ] > drm[x] + nc[x][i])
{
drm[ nd[x][i] ] = drm[x] + nc[x][i];
viz[nd[x][i]] = 1;
dr++;
coada[dr%mod] = nd[x][i];
}
}
st++;
}
ok = 1;
for (i = 1; i <= n && ok; i++)
{
//g << drm[i] <<" ";
if (drm[i] != fin[i])
ok = 0;
}
if (ok)
g << "DA\n";
else
g << "NU\n";
t--;
}
return 0;
}