Pagini recente » Cod sursa (job #2267626) | Cod sursa (job #713950) | Cod sursa (job #296618) | Cod sursa (job #1597724) | Cod sursa (job #712149)
Cod sursa(job #712149)
#include<stdio.h>
#define INF 1 << 30
#define N 50005
FILE *f=fopen("distante.in","r"), *g=fopen("distante.out","w");
int d[N], H[N], poz[N], el, n, m,s, r[N];
struct nod
{
int y, c;
nod *urm;
} *v[N];
void swap(int &a, int &b)
{
a=a^b;
b=a^b;
a=a^b;
}
void downheap(int k)
{
int son;
do
{
son=0;
if(k*2 <= el) son=k*2;
if(k*2+1 <=el && d[ H [k*2+1] ] < d[ H[k*2] ])
son= 2*k+1;
if( d[H[k]] < d[H[son]])
son=0;
if(son)
{
swap(H[k], H[son]);
swap(poz[H[k]], poz[H[son]]);
//poz[H[k]] = son;
//poz[H[son]] = k;
}
k=son;
} while(son);
}
void upheap(int k)
{
int val=d[ H[k] ];
while(val < d[ H[ k/2 ]] && k>1)
{
swap(H[k], H[k/2]);
swap(poz[H[k]], poz[H[k/2]]);
//poz[H[k]]= k/2;
//poz[H[k/2]]= k;
k=k/2;
}
}
void push(int x)
{
H[++el]=x;
poz[x]=el;
upheap(el);
}
void rez(int s)
{
int min;
for(int i=1; i<=n;i++)
d[i]= INF;
for(nod *p=v[s]; p; p=p->urm)
{
d[ p->y ]= p->c;
push(p->y);
}
while(el)
{
min=d[ H[1] ];
nod *p= v[ H[1] ];
poz[H[el]]=1;
H[1]=H[el--];
downheap(1);
while(p)
{
if ( ( d[p->y] > p->c + min) && ( p->y != s) )
if(d[p->y]==INF)
{
d[p->y]= p->c+min;
H[++el]=p->y;
poz[p->y]=el;
upheap(poz[p->y]);
}
else
{
d[p->y]= p->c+min;
upheap(poz[p->y]);
}
p=p->urm;
}
}
}
void add(int x, int y, int c)
{
nod *p=new nod;
p->c=c;
p->y=y;
p->urm=v[x];
v[x]=p;
}
int main()
{
int T;
int a, b, c;
fscanf(f,"%d", &T);
for(int i=1; i<=T;i++)
{
fscanf(f,"%d %d %d", &n, &m, &s);
for(int i=1; i<=n;i++)
fscanf(f,"%d ", &r[i]);
for(int i=1;i<=m;i++)
{
fscanf(f,"%d %d %d", &a, &b, &c);
add(a,b,c);
add(b,a,c);
}
rez(s);
int sw=0;
for(int i=1; i<=n;i++)
if(r[i]!= d[i] && i!=s)
{
fprintf(g,"NU\n");
sw=1;
break;
}
if(!sw)
fprintf(g,"DA\n");
}
return 0;
}