Pagini recente » Cod sursa (job #2515900) | Cod sursa (job #2580287) | Cod sursa (job #2923020) | Cod sursa (job #1972132) | Cod sursa (job #2305014)
#include <fstream>
using namespace std;
ifstream fin ("distante.in");
ofstream fout("distante.out");
int t, m, n, s, d[50500], c[10000][10000];
#define INF 9999999
bool dijkstra_check(int r);
void cit()
{
fin >> t;
int i, j, k, cost, a, b;
for(k = 1; k <= t; k++)
{
fin >> n >> m >> s;
for(i = 1; i <= n; i++)
fin >> d[i];
//clear Cost matrix
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(i != j)
c[i][j] = INF;
else
c[i][j] = 0;
for(i = 1; i <= m; i++)
{
fin >> a >> b >> cost;
c[a][b] = c[b][a] = cost;
}
if(dijkstra_check(s))
fout << "DA" << endl;
else
fout << "NU" << endl;
}
}
bool dijkstra_check(int r)
{
int i, j, k, Min,
_d[50500], t[50500], _s[50500];
for(i = 1; i <= n; i++)
{
_d[i] = INF;
t[i] = 0;
}
for(i = 1; i <= n; i++)
{
_d[i] = c[r][i];
t[i] = r;
t[r] = 0;
_s[r] = 1; // i
for(k = 1; k < n; k++)
{
Min = INF;
for(j = 1; j <= n; j++)
if(_s[j] == 0 && _d[j] < Min)
{
Min = _d[j];
i = j;
}
_s[i] = 1;
for(j = 1; j <= n; j++)
if(_d[j] > _d[i] + c[i][j])
{
_d[j] = _d[i] + c[i][j];
t[j] = i;
}
}
}
for(i = 1; i <= n; i++)
if(_d[i] != d[i])
return false;
return true;
}
int main()
{
cit();
return 0;
}