Pagini recente » Cod sursa (job #1342888) | Cod sursa (job #505310) | Cod sursa (job #2346203) | Cod sursa (job #1422881) | Cod sursa (job #416195)
Cod sursa(job #416195)
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
#define MAXN 50005
using namespace std;
const int inf=2000000;
int d[MAXN],n,m,s,dist[100001];
vector< pair<int, int> > G[MAXN];
ifstream f("distante.in");
ofstream g("distante.out");
void solve();
int main()
{
int t,nr,i,x,y,z,ok;
f>>t;
for (; t; t--)
{
f>>n>>m>>s;
nr=1;
memset (G,0,sizeof(G[0]));
for (i=1;i<=n;i++) f>>dist[i];
for(i=0;i<m;i++)
{
f>>x>>y>>z;
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
solve();
ok=1;
for(i=1;i<=n;i++) if(d[i]!=dist[i]) ok=0;
if (ok) g<<"DA\n";
else g<<"NU\n";
}
return 0;
}
void solve()
{
bool InQueue[MAXN];
queue<int> Q;
memset(InQueue, false, sizeof(InQueue));
for (int i=1; i<=n; i++) d[i]=inf;
d[s] = 0;
Q.push(s);
InQueue[s] = true;
while (!Q.empty())
{
int nod = Q.front();
Q.pop();
InQueue[nod] = false;
for (vector< pair<int, int> >::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
if (d[nod] + it->second < d[it->first])
{
d[it->first] = d[nod] + it->second;
if (!InQueue[it->first])
{
Q.push(it->first);
InQueue[it->first] = true;
}
}
}
}