Pagini recente » Cod sursa (job #316711) | Cod sursa (job #3300616) | Cod sursa (job #1347776) | Cod sursa (job #203279) | Cod sursa (job #695327)
Cod sursa(job #695327)
#include<stdio.h>
#include<queue>
#include<string.h>
#include<algorithm>
#define pb push_back
#define Nmax 50009
#define nod first
#define cost second
#define mp make_pair
#define inf 0x3f3f3f3f
using namespace std;
int j,t,S,x,y,i,n,m,c,sol[Nmax],D[Nmax];
vector<pair<int,int> > a[Nmax];
vector<pair<int,int> >::iterator it;
struct cmp
{
bool operator() (const int &x,const int &y)
{
return (D[x]>D[y]);
}
};
priority_queue<int,vector<int>,cmp> Q;
int dijkstra(int start)
{
memset(D,inf,sizeof(D));
D[start]=0;
Q.push(start);
while (!Q.empty())
{
x=Q.top();
for (it=a[x].begin();it!=a[x].end();it++)
if (D[x]+(*it).cost<D[(*it).nod])
{
D[(*it).nod]=D[x]+(*it).cost;
Q.push((*it).nod);
}
Q.pop();
}
for (int i=1;i<=n;i++) if (D[i]!=sol[i]) return 0;
return 1;
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for (j=1;j<=t;j++)
{
scanf("%d%d%d",&n,&m,&S);
for (i=1;i<=n;i++)
{
a[i].clear();
scanf("%d",&sol[i]);
}
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
a[x].pb(mp(y,c));
a[y].pb(mp(x,c));
}
if (dijkstra(S)) printf("DA\n");
else printf("NU\n");
}
}