Pagini recente » Cod sursa (job #2524124) | Cod sursa (job #925453) | Cod sursa (job #291970) | Cod sursa (job #2189610) | Cod sursa (job #1092008)
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 50099
#define Mmax 100099
#define oo 2000000000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int T,N,M,S,d[Nmax],v[Nmax];
struct muchie{int nod,c;};
vector < muchie > Graph[Nmax];
struct cmp
{
bool operator()(const int &a,const int &b)
{
return (d[a]>d[b]);
};
};
priority_queue < int , vector < int > , cmp > pq;
int Dijkstra(const int &S)
{
for(int i=1;i<=N;++i)d[i]=oo;
d[S]=0;
pq.push(S);
for( ; !pq.empty() ; pq.pop())
{
int x=pq.top();
for(vector<muchie>::iterator it=Graph[x].begin();it!=Graph[x].end();++it)
if(d[x]+it->c < d[it->nod])
{
d[it->nod]=d[x]+it->c ;
pq.push(it->nod);
}
}
for(int i=1;i<=N;++i)
{
if(d[i]==oo)d[i]=0;
if(d[i]!=v[i])return 0;
}
return 1;
}
void ReadInput()
{
f>>N>>M>>S;
for(int i=1;i<=N;++i)f>>v[i];
for(int i=1;i<=M;++i)
{
int x,y,c; muchie aux;
f>>x>>y>>aux.c;
aux.nod=y; Graph[x].push_back(aux);
aux.nod=x; Graph[y].push_back(aux);
}
}
int main()
{
f>>T;
for(int i=1;i<=T;++i)
{
ReadInput();
if(Dijkstra(S))g<<"DA\n";
else g<<"NU\n";
for(int j=1;j<=N;++j)Graph[j].clear();
}
f.close();g.close();
return 0;
}