Pagini recente » Cod sursa (job #1067216) | Cod sursa (job #1919328) | Cod sursa (job #1646085) | Cod sursa (job #1669128) | Cod sursa (job #1422933)
#include <iostream>
#include <bits/stdc++.h>
#define NMax 50005
#define INFINIT 999999999
using namespace std;
int D[NMax],d[NMax],N,M,T,S,x,y,z;
vector< pair<int,int> > Graf[NMax];
class Compara
{
public:
bool operator()(const int &a,const int &b)
{
return D[a]>D[b];
}
};
priority_queue<int,vector<int>,Compara> Q;
void Curata()
{
for(int i=1;i<=Graf[i].size();i++)
{
Graf[i].clear();
}
}
void Dijkstra(int k)
{
for(int i=1; i<=N; i++)
d[i]=INFINIT;
d[k]=0;
Q.push(k);
while(!Q.empty())
{
int x=Q.top();
Q.pop();
for(int i=0; i<Graf[x].size(); ++i)
{
pair <int, int> p=Graf[x][i];
if(d[p.first]> d[x]+p.second)
{
d[p.first] = d[x]+p.second;
Q.push(p.first);
}
}
}
}
void Afisare()
{
//freopen("distante.out","w",stdout);
ofstream f("distante.out");
int OK=1;
for(int i=1;i<=N;i++)
if(D[i]!=d[i])
OK=0;
if(OK==1)
{
f<<"DA\n";
return;
}
else
f<<"NU\n";
}
void Citire()
{
// freopen("distante.in","r",stdin);
//scanf("%d",&T);
ifstream g("distante.in");
g>>T;
for(int iterator=1;iterator<=T;iterator++)
{
// scanf("%d%d%d",&N,&M,&S);
g>>N>>M>>S;
Curata();
for(int k=1;k<=N;k++)
// scanf("%d",&D[k]);
g>>D[k];
for(int k=1;k<=M;k++)
{
// scanf("%d%d%d",&x,&y,&z);
g>>x>>y>>z;
Graf[x].push_back(make_pair(y,z));
Graf[y].push_back(make_pair(x,z));
}
Dijkstra(S);
Afisare();
}
}
int main()
{
Citire();
}