Pagini recente » Cod sursa (job #60846) | Cod sursa (job #701905) | Cod sursa (job #2768075) | Cod sursa (job #1987062) | Cod sursa (job #688598)
Cod sursa(job #688598)
#include<stdio.h>
#include<vector>
#include<queue>
#include<limits.h>
#define NMAX 50005
using namespace std;
int D[NMAX],N,M,T,S,BRONZAREL[NMAX];
vector< pair<int,int> >V[NMAX];
queue<int>COADA;bool EXISTENTA[NMAX];
void deschidere()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
}
void afisare()
{
int i;
for(i=1;i<=N;i++)
if(BRONZAREL[i]!=D[i])
{printf("NU\n");return;}
printf("DA\n");return;
}
void initializare()
{
for(int i=1;i<=N;i++)
D[i]=INT_MAX,EXISTENTA[i]=0;
}
void rezolvare()
{
COADA.push(S);
EXISTENTA[S]=1;
D[S]=0;
while(COADA.size())
{
int nod=COADA.front();
for(int i=0;i<V[nod].size();i++)
if(D[V[nod][i].first]>D[nod]+V[nod][i].second)
{
D[V[nod][i].first]=D[nod]+V[nod][i].second;
if(!EXISTENTA[V[nod][i].first])
{
COADA.push(V[nod][i].first);
EXISTENTA[V[nod][i].first]=1;
}
}
COADA.pop();
}
}
void citire()
{
int X,Y,C,i;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&N,&M,&S);
for(i=1;i<=N;i++)
scanf("%d",&BRONZAREL[i]);
while(M--)
{
scanf("%d%d%d",&X,&Y,&C);
V[X].push_back(make_pair(Y,C));
}
initializare();
rezolvare();
afisare();
}
}
int main()
{
deschidere();
citire();
return 0;
}