Pagini recente » Cod sursa (job #1797515) | Cod sursa (job #2050366) | Cod sursa (job #1812036) | Cod sursa (job #2031666) | Cod sursa (job #1639702)
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
//Pentru Dijkstra
#define INFINIT 0x3f3f3f3f
#define NMAX 50005
#define MMAX 100005
int Distante[NMAX];
void Dijkstra(vector< pair<int,int> > Graf[MMAX], int sursa) {
queue<int> Coada;
memset(Distante, INFINIT, sizeof(Distante));
Coada.push(sursa);
Distante[sursa] = 0;
while(!Coada.empty()) {
int p = Coada.front();
Coada.pop();
for(vector< pair<int,int> >::iterator Itr = Graf[p].begin(); Itr != Graf[p].end(); ++Itr) {
if(Distante[Itr->first] > Distante[p] + Itr->second) {
Distante[Itr->first] = Distante[p] + Itr->second;
Coada.push(Itr->first);
}
}
}
}
int main() {
ifstream in("distante.in");
ofstream out("distante.out");
int cicluri;
in>>cicluri;
for(int k=1;k<=cicluri;++k) {
vector< pair<int,int> > graf[MMAX];
int n,m,sursa,verificare[NMAX];
in>>n>>m>>sursa;
for(int i=1;i<=n;++i) in>>verificare[i];
for(int i=1;i<=m;++i) {
int x,y,c;
in>>x>>y>>c;
graf[x].push_back({y,c});
graf[y].push_back({x,c});
}
Dijkstra(graf, sursa);
bool Ok=1;
for(int i=1;i<=n;++i) {
if(verificare[i] != (Distante[i] != INFINIT ? Distante[i] : 0)) Ok=0;
}
if(Ok) out<<"DA\n";
else out<<"NU\n";
}
return 0;
}