Pagini recente » Cod sursa (job #2202749) | Cod sursa (job #2435112) | Cod sursa (job #1199068) | Cod sursa (job #1270117) | Cod sursa (job #2849455)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define NMAX 30005
const int INF = 10005;
int n , m , s;
short c[NMAX][NMAX] ;
int pre[NMAX] , d[NMAX] ;
bool M[NMAX];
void dijkstra(int start)
{
for(int i = 1 ; i <= n ; i ++)
M[i] = 0;
M[start] = 1;
for(int i = 1 ; i <= n ; i ++)
{
d[i] = c[start][i];
if(i != start)
pre[i] = start;
else
pre[i] = 0;
}
for(int i = 1 ; i < n ; i ++)
{
int dmin = INF , vfmin;
for(int j = 1 ; j <= n ; j ++)
{
if(!M[j] && d[j] < dmin)
{
dmin = d[j];
vfmin = j;
}
}
M[vfmin] = 1;
for(int j = 1 ;j <= n ; j ++)
{
if(!M[j] && d[j] > d[vfmin] + c[vfmin][j])
{d[j] = dmin + c[vfmin][j];
pre[j] = vfmin;
}
}
}
}
int main()
{
int t , dist[NMAX];
fin>>t;
while(t--)
{
fin>>n>>m>>s;
for(int i = 1 ;i <= n ; i ++)
fin>>dist[i];
for(int i = 1 ; i <= n ; i ++)
for(int j = i+1 ; j <= n ; j ++)
c[i][j] = c[j][i] = INF;
for(int i = 1 ;i <= m ; i ++)
{
int a,b,cost;
fin>>a>>b>>cost;
c[a][b] = c[b][a] = cost;
}
bool ok = true;
dijkstra(s);
for(int i = 1 ; i <= n ; i ++)
{
if(d[i] != dist[i])
{
ok = false;
break;
}
}
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
}
}