Pagini recente » Cod sursa (job #1121620) | Cod sursa (job #1774373) | Cod sursa (job #1291327) | Cod sursa (job #889015) | Cod sursa (job #1043418)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <climits>
#define INFINIT INT_MAX
#define mp make_pair
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct element{
int vf;
int d;
};
int caz,n,m,nod,d[50005],d_fin[50005];
vector<element> V[50005];
set< pair<int,int> > T;
int main()
{
fin>>caz;//numar cazuri
for(;caz;caz--){
//reinitializez vectorul de elemente
for(int i=1;i<=n;i++){
V[i].clear();
}
fin>>n>>m>>nod;//citesc nr noduri,nr muchii,nod radacina
for(int i=1;i<=n;i++)//reinitializez vectorul distanta
d[i]=INFINIT;
//CITIRE
for(int i=1;i<=n;i++){
fin>>d_fin[i];
}
int a;element b,c;
for(;m;m--){
fin>>a>>b.vf>>b.d;
V[a].push_back(b);
c.vf=a;c.d=b.d;
V[b.vf].push_back(c);
}
//DIJKSTRA
d[nod]=0;
T.insert(mp(0,nod));
while(T.size()>0){
int dist_act,nodu;
dist_act=(*T.begin()).first;
nodu=(*T.begin()).second;
T.erase(*T.begin());
for(int i=0;i<V[nodu].size();i++){
int urm,d_urm;
urm=V[nodu][i].vf;
d_urm=V[nodu][i].d;
if(d[urm]>dist_act+d_urm){
d[urm]=dist_act+d_urm;
T.insert(mp(d[urm],urm));
}
}
}
//VERIFICARE FINALA
bool OK=true;
for(int i=1;i<=n;i++)
if(d[i]!=d_fin[i])
OK=false;
if(OK==true)
fout<<"DA\n";
else
fout<<"NU\n";
}
return 0;
}