Pagini recente » Borderou de evaluare (job #2772092) | Cod sursa (job #49308) | Cod sursa (job #2131988) | Cod sursa (job #1822586) | Cod sursa (job #964497)
Cod sursa(job #964497)
#include<cstdio>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
const static int DIM = 50101;
const static int INFINIT = 1 << 20;
int dist[DIM];
bool in_queue[DIM];
int s;
int drum[DIM];
vector< pair<int,int> >graf[DIM];
int print (int start,int n)
{
drum[start] = 0;
for(int i=1; i<=n; ++i)
{
if(dist[i] != drum[i])
return 0;
}
return 1;
}
void bellford(int start , int n)
{
int nod , i;
queue <int> queue_graf;
fill(drum + 1,drum + n + 1, INFINIT);
fill(in_queue +1 , in_queue+n + 1 , false);
drum[start]=0;
queue_graf.push(start);
in_queue[start] = true;
while(!queue_graf.empty())
{
nod=queue_graf.front();
queue_graf.pop();
in_queue[nod] = false;
for( i=0; i<graf[nod].size(); ++i )
{
if(drum[nod]+graf[nod][i].second<drum[graf[nod][i].first])
{
drum[graf[nod][i].first] = drum[nod]+graf[nod][i].second;
if (!in_queue[nod])
{
queue_graf.push(graf[nod][i].first);
in_queue[nod] = true;
}
}
}
}
if(print(start,n)) printf("DA\n");
else
printf("NU\n");
}
void reset(int n)
{
for(int i=1; i<=n; ++i)
{
dist[i] = 0;
in_queue[i] = false;
graf[i].clear();
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int A,B,C,n = 0,m;
int t;
scanf("%d",&t);
int cnt = 0, i = 0;
for (cnt=1; cnt<=t; ++cnt)
{
scanf("%d%d",&n,&m);
scanf("%d",&s);
for (i=1; i<=n; ++i)
scanf("%d",&dist[i]);
for (i=1; i<=m; ++i)
{
scanf("%d %d %d",&A,&B,&C);
graf[A].push_back(make_pair(B, C));
graf[B].push_back(make_pair(A, C));
}
bellford(s,n);
reset(n);
}
return 0;
}