Pagini recente » Cod sursa (job #3160500) | Cod sursa (job #16723) | Cod sursa (job #1906849) | Cod sursa (job #1646842) | Cod sursa (job #688609)
Cod sursa(job #688609)
#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 initializare2()
{
for (int i=1;i<=N;i++)
V[i].clear();
}
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));
V[Y].push_back(make_pair(X,C));
}
initializare();
rezolvare();
afisare();
initializare2();
}
}
int main()
{
deschidere();
citire();
return 0;
}