Pagini recente » Monitorul de evaluare | Cod sursa (job #1246131) | Cod sursa (job #616091) | Cod sursa (job #1649312) | Cod sursa (job #281724)
Cod sursa(job #281724)
using namespace std;
#include<cstdio>
#include<string>
#define Nmax 50000
#define Mmax 100000
#define inf 1500
int h[Nmax],d[Nmax],poz[Nmax],d2[Nmax],n,m,s,k,min1,T,sol[11];
struct nod { int v,cost; nod *next;};
nod *a[Nmax];
void add(int i,int j,int c)
{
nod*p=new nod;
p->v=i;
p->next=a[j];
p->cost=c;
a[j]=p;
p=new nod;
p->v=j;
p->next=a[i];
p->cost=c;
a[i]=p;
}
void sc(int i ,int j)
{
int aux=h[i];
h[i]=h[j];
h[j]=aux;
poz[h[i]]=i;
poz[h[j]]=j;
}
void upheap(int i)
{
int tata=i/2;
while(tata && d[h[tata]]>d[h[i]])
{
sc(tata,i);
i=tata;
tata=tata/2;
}
}
void downheap(int i)
{
int fiu=2*i;
while(fiu<=k)
{
if(fiu<k &&d[h[fiu]]>d[h[fiu+1]]) fiu++;
if(d[h[fiu]]<d[h[i]])
{
sc(fiu,i);
i=fiu;
fiu=fiu*2;
}
else fiu=k+1;
}
}
void dij(int n,int s)
{
for(int i=1;i<=n;i++)
{
d[i]=inf;
poz[i]=-1;
}
k=0;
h[++k]=s;
poz[h[k]]=1;
d[s]=0;
while(k)
{
min1=h[1];
sc(1,k);
k--;
downheap(1);
for(nod *u=a[min1];u;u=u->next)
if(d[u->v]>d[min1]+u->cost)
{
d[u->v]=d[min1]+u->cost;
if(poz[u->v]!=-1) upheap(poz[u->v]);
else {
h[++k]=u->v;
poz[u->v]=k;
upheap(k);
}
}
}
}
int main()
{
int i,x,y,z,t;
freopen("distante.in","r",stdin);
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
memset(a,NULL,sizeof(nod));
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++)
scanf("%d",&d2[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dij(n,s);
x=0;
for(i=1;i<=n && x==0;i++)
if(d[i]!=d2[i]) x=1;
if(x==0)sol[t]=1;
}
freopen("distante.out","w",stdout);
for(t=1;t<=T;t++)
if(sol[t]) printf("DA\n");
else printf("NU\n");
return 0;
}