Pagini recente » Cod sursa (job #40731) | Cod sursa (job #1382344) | Cod sursa (job #928425) | Cod sursa (job #2754913) | Cod sursa (job #2289258)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int NMAX=50010;
const int oo=(1<<20);
int c[NMAX],d[NMAX],n,m,s,T;
bool vizitat[NMAX];
vector<pair<int,int> >G[NMAX];
struct comp
{
bool operator() (int i,int j)
{
return c[i]>c[j];
}
};
priority_queue<int,vector<int>,comp>coada;
void citire()
{
int x,y,z;
f>>n>>m>>s;
for(int i=1;i<=n;i++)
f>>d[i];
for(int i=1;i<=n;i++)
G[i].clear();
for(int i=1;i<=m;i++)
{
f>>x>>y>>z;
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
}
bool dijkstra(int sursa)
{
for(int i=1;i<=n;i++)
vizitat[i]=0;
for(int i=1;i<=n;i++)
c[i]=oo;
c[sursa]=0;
if(c[sursa]<d[sursa])return 0;
coada.push(sursa);
vizitat[sursa]=1;
while(!coada.empty())
{
int ncrt=coada.top();
coada.pop();
vizitat[ncrt]=0;
for(int i=0;i<G[ncrt].size();i++)
{
int vecin=G[ncrt][i].first;
int cost=G[ncrt][i].second;
if(vizitat[vecin]==0 && c[ncrt]+cost<c[vecin])
{
c[vecin]=c[ncrt]+cost;
if(c[vecin]<d[vecin])return 0;
vizitat[vecin]=1;
coada.push(vecin);
}
}
}
return 1;
}
void afisare()
{
for(int i=1;i<=n;i++)
if(d[i]!=c[i]){g<<"NU"<<'\n';return;}
g<<"DA"<<'\n';
}
int main()
{
f>>T;
while(T)
{
citire();
if(dijkstra(s))
{
afisare();
}
else g<<"NU"<<'\n';
T--;
}
return 0;
}