Pagini recente » Cod sursa (job #69246) | Cod sursa (job #331995) | Cod sursa (job #3166838) | Cod sursa (job #203155) | Cod sursa (job #952090)
Cod sursa(job #952090)
#include<iostream>
#include <fstream>
#include<vector>
#include<queue>
#include<cstdio>
#include<algorithm>
#define lim 60000
#define inf 1<<30
using namespace std;
class distante {
int t,n,m,s;
int dist[lim],fr[lim];
bool incoada[lim];
struct muchie
{
int nod;
int cost;
};
vector<muchie> G[lim];
queue<int> coada;
fstream in,out;
public:
distante(string fin,string fout)
{
in.open(fin.c_str(), ios::in);
out.open(fout.c_str(), ios::out);
}
~distante()
{
in.close();
out.close();
}
void bf()
{
int cost,x,y;
bool ok=true;
coada.push(s);
for(int i=1;i<=n;i++)
{
dist[i]=inf;
fr[i]=0;
incoada[i]=false;
}
dist[s]=0;
incoada[s]=true;
while(ok && !coada.empty())
{
x=coada.front();
coada.pop();
incoada[x]=false;
for(int i=0;i<G[x].size();i++)
{
y=G[x][i].nod;
cost=G[x][i].cost;
if(dist[x]+cost<dist[y])
{
dist[y]=dist[x]+cost;
if(!incoada[y])
{
if(fr[y]>n)
ok=false;
else
{
coada.push(y);
incoada[y]=1;
fr[y]++;
}
}
}
}
}
}
void solve()
{
in>>t;
muchie a,b;
bool ok;
int d[lim];
while(t--)
{
in>>n>>m>>s;
for(int i=1;i<=n;i++)
{
in>>d[i];
}
for(int i=1;i<=m;i++)
{
in>>a.nod>>b.nod>>b.cost;
G[a.nod].push_back(b);
a.cost=b.cost;
G[b.nod].push_back(a);
}
if(d[s]==0)
{
bf();
ok=true;
for(int i=1;i<=n;i++)
{
if(d[i]!=dist[i])
{
out<<"NU"<<endl;
i=n;
ok=false;
}
}
if(ok==true)
{
out<<"DA"<<endl;
}
}
else
{
out<<"NU"<<endl;
}
}
}
};
int main()
{
distante X("distante.in","distante.out");
X.solve();
return 0;
}