Pagini recente » Cod sursa (job #212402) | Cod sursa (job #307348) | Cod sursa (job #1689789) | Cod sursa (job #2305276) | Cod sursa (job #2451586)
#include<bits/stdc++.h>
#define BFR zeii
#define NMAX 50001
#define pb push_back
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int t, n, m, s;
int dp[ NMAX ], dp_c[ NMAX ];
bitset< NMAX >viz;
vector< pair< int, int > >G[ NMAX ];
priority_queue< pair< int, int >, vector< pair < int, int > >, greater< pair< int, int > > > H;
void DIJ(int node_start)
{
viz.reset();
for(int i = 1 ; i <= n ; ++i)
dp_c[ i ] = INT_MAX;
dp_c[ node_start ] = 0;
H.push({0, node_start});
while( !H.empty() )
{
int node = H.top().second;
H.pop();
if( viz[ node ] )
continue;
viz[ node ] = 1;
for(int i = 0 ; i < G[ node ].size() ; ++i)
{
int vecin = G[ node ][ i ].first;
int cost = G[ node ][ i ].second;
if( dp_c[ vecin ] > dp_c[ node ] + cost)
{
dp_c[ vecin ] = dp_c[ node ] + cost;
if( viz[ vecin ] == 0)
{
H.push({dp_c[ vecin ], vecin});
}
}
}
}
}
int main()
{
f >> t;
for( ; t ; t--)
{
f >> n >> m >> s;
for(int i = 1 ; i <= n ; ++i)
{
f >> dp[ i ];
G[ i ].clear();
}
for(int i = 1 ; i <= m ; ++i)
{
int x, y, c;
f >> x >> y >> c;
G[ x ].pb({y, c});
G[ y ].pb({x, c});
}
bool ok = true;
if( dp[ s ] == 0)
{
DIJ( s );
}
else
ok = false;
for(int i = 1 ; i <= n && ok == true ; ++i)
{
if(dp_c[ i ] != dp[ i ])
ok = false;
}
if( ok )
{
g << "DA\n";
}
else
g << "NU\n";
}
}