Pagini recente » Cod sursa (job #448520) | Cod sursa (job #1749655) | Cod sursa (job #621864) | Cod sursa (job #367798) | Cod sursa (job #2331497)
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50000;
const int INF=2000000000;
struct muchie
{
int nod, cost;
bool operator <(const muchie&a)const{
return cost>a.cost;
}
};
int dist[NMAX+5];
bitset <NMAX+5>viz;
int dist_originale[NMAX+5];
priority_queue <muchie>q;
vector <muchie>G[NMAX+5];
void Dijkstra(int sursa)
{
muchie a, b;
int i;
viz[sursa]=1;
a.nod=sursa;
a.cost=0;
dist[sursa]=0;
q.push(a);
while(!q.empty())
{
a=q.top();
q.pop();
if(a.cost>dist[a.nod])
continue;
else
{
for(i=0;i<G[a.nod].size();i++)
{
b.nod=G[a.nod][i].nod;
b.cost=G[a.nod][i].cost;
if(dist[a.nod]+b.cost<dist[b.nod])
{
dist[b.nod]=dist[a.nod]+b.cost;
b.cost=dist[b.nod];
q.push(b);
}
}
}
}
}
int main()
{
int n, i, m, s, x, t;
muchie a;
fin>>t;
for(int j=1;j<=t;j++)
{
fin>>n>>m>>s;
for(i=1;i<=n;i++)
{
fin>>dist_originale[i];
dist[i]=INF;
G[i].clear();
}
for(i=1;i<=m;i++)
{
fin>>x>>a.nod>>a.cost;
G[x].push_back(a);
int aux=x;
x=a.nod;
a.nod=aux;
G[x].push_back(a);
}
Dijkstra(s);
bool ok=1;
for(i=1;i<=n;i++)
{
if(dist[i]!=dist_originale[i])
{
ok=0;
break;
}
}
if(ok==1)
fout<<"DA"<<"\n";
else
fout<<"NU"<<"\n";
}
return 0;
}