Pagini recente » Cod sursa (job #1819038) | Arhiva de probleme, pregatire pentru concursuri de informatica | Cod sursa (job #1439344) | Cod sursa (job #1011198) | Cod sursa (job #2671725)
#include <fstream>
#include <vector>
#include <queue>
#define N 50005
#define INF 1000000
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int t, n, m, s;
bool vizitat[N];
int dist[N], actualDist[N];
struct comp{
bool operator()(int x, int y){
return dist[x] > dist[y];
}
};
priority_queue<int, vector<int>, comp> coada;
vector< vector< pair<int, int> > > graf(N);
void dijkstra(int nodStart){
for(int i = 1; i <= n; ++i)
dist[i] = INF;
coada.push(nodStart);
vizitat[nodStart] = 1;
dist[nodStart] = 0;
while(!coada.empty()){
int nodCurent = coada.top();
coada.pop();
for(unsigned int i = 0; i < graf[nodCurent].size(); ++i){
int nodVecin = graf[nodCurent][i].first;
int cost = graf[nodCurent][i].second;
if(dist[nodCurent] + cost < dist[nodVecin]){
dist[nodVecin] = dist[nodCurent] + cost;
if(vizitat[nodVecin] == 0) vizitat[nodVecin] = 1, coada.push(nodVecin);
}
}
}
}
int main()
{
in>>t;
while(t--){
in>>n>>m>>s;
for(int i = 1; i <= n; ++i)
in>>actualDist[i];
for(int i = 1; i <= m; ++i){
int x, y, c;
in>>x>>y>>c;
graf[x].push_back(make_pair(y, c));
graf[y].push_back(make_pair(x, c));
}
dijkstra(s);
bool sem = 0;
for(int i = 1; i <= n; ++i)
if(actualDist[i] != dist[i]){
sem = 1;
break;
}
if(sem) out<<"NU\n";
else out<<"DA\n";
}
in.close();
out.close();
return 0;
}