Pagini recente » Cod sursa (job #1966378) | Cod sursa (job #2483457) | Cod sursa (job #1868257) | Cod sursa (job #3121970) | Cod sursa (job #2306260)
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50001
#define INF 10000000
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");
struct NOD{
unsigned short int n;
unsigned int d;
};
struct cmp{
bool operator()(const NOD&a, const NOD&b)const{
return(a.d>b.d);
}
};
int t,n,m,s,d[NMAX];
int x,y,c,z;
vector<int> vv[NMAX], cost[NMAX], dd;
priority_queue<NOD ,vector<NOD>, cmp> pq;
bool sel[NMAX];
void dijkstra(int s)
{
NOD nod;
int nmin,v,dn;
for(int i=1;i<=n;i++)
d[i]=INF;
d[s]=0;
nod.n=s;
nod.d=0;pq.push(nod);
while(!pq.empty())
{
nod=pq.top();pq.pop();
nmin=nod.n;
if(!sel[nmin])
{
for(int j=0;j<vv[nmin].size();j++)
{
v=vv[nmin][j];
if(!sel[v])
{
dn=d[nmin]+cost[nmin][j];
if(dn<d[v])
{
d[v]=dn;
nod.n=v;
nod.d=dn;
pq.push(nod);
}
}
}
}
}
int corect=1;
for(int i=0;i<n;i++)
if(d[i+1]!=dd[i])
corect=0;
if(corect)
fo<<"DA"<<'\n';
else
fo<<"NU"<<'\n';
}
int main()
{
fi>>t;
for(int i=1;i<=t;i++)
{
fi>>n>>m>>s;
for(int j=1;j<=n;j++)
{
fi>>z;
dd.push_back(z);
}
for(int j=1;j<=m;j++)
{
fi>>x>>y>>c;
vv[x].push_back(y);
cost[x].push_back(c);
}
dijkstra(s);
for(int j=1;j<=n;j++)
{
vv[i].clear();
cost[i].clear();
}
dd.clear();
}
return 0;
}