Pagini recente » Cod sursa (job #2494368) | Cod sursa (job #1789475) | Cod sursa (job #2819377) | Cod sursa (job #2930838) | Cod sursa (job #880260)
Cod sursa(job #880260)
#include<cstdio>
#include<fstream>
#include<vector>
#include<set>
#define pb push_back
#define MAX 50001
#define INF 50000002
using namespace std;
int t , n , m , s , d[MAX] , sol[MAX];
vector<int> C[MAX];
vector<int> G[MAX];
vector<int>::iterator it , it1;
bool sw;
struct Compar{
bool operator()(int i , int j)
{
return d[i] < d[j];
}
};
multiset<int,Compar> Q;
void dijkstra(int nod);
int main()
{
int x , y , cost;
ifstream f("distante.in");
ofstream g("distante.out");
f>>t;
for( int i = 1 ; i <= t ; ++i )
{
f>>n>>m>>s;
for( int i = 1 ; i<= n ; ++i )
f>>sol[i];
for( int j = 1 ; j<= m ; ++j )
{
f>>x>>y>>cost;
C[x].pb(cost);
C[y].pb(cost);
G[x].pb(y);
G[y].pb(x);
}
dijkstra(s);
sw = 1;
for( int i = 1 ; i<= n && sw; ++i )
if(d[i] != sol[i])sw = 0;
if(sw)g<<"DA"<<"\n";
else g<<"NU"<<"\n";
}
f.close();
g.close();
return 0;
}
void dijkstra( int nod)
{
int k;
for( int i = 1 ; i<= n ; ++i )d[i] = INF;
d[s] = 0;
Q.insert(s);
while(!Q.empty())
{
k = *Q.begin();
Q.erase(Q.begin());
for(it = G[k].begin() , it1 = C[k].begin() ; it < G[k].end() ; it++ , it1++ )
if(d[*it] > d[k] + *it1)
{
d[*it] = d[k] + *it1;
Q.insert(*it);
}
}
}