Pagini recente » Cod sursa (job #100084) | Cod sursa (job #1890050) | Cod sursa (job #2362805) | Cod sursa (job #1946002) | Cod sursa (job #382330)
Cod sursa(job #382330)
using namespace std;
#include<fstream>
struct nod
{
int capat;
int cost;
nod* next;
};
nod* G[50005];
int T,N,M,S,D[50005],v[50005],d[50005];
void adauga(int,int,int);
void sterge();
int main()
{
nod *p;
int i,j,a,b,c,gata,pmin;
ifstream fin("distante.in");
fin>>T;
ofstream fout("distante.out");
for(i=1;i<=T;++i)
{
fin>>N>>M>>S;
for(j=1;j<=N;++j)
fin>>D[j];
for(j=1;j<=M;++j)
{
fin>>a>>b>>c;
adauga(a,b,c);
adauga(b,a,c);
}
if(D[S])
fout<<"NU\n";
else
{
for(j=N;j>=0;--j)
{
v[j]=0;
d[j]=200000000;
}
v[S]=1;
d[S]=0;
for(p=G[S];p;p=p->next)
d[p->capat]=p->cost;
while(gata==0)
{
pmin=0;
for(j=1;j<=N;++j)
if(v[j]==0)
if(d[j]<d[pmin])
pmin=j;
if(pmin==0)
gata=1;
else
{
v[pmin]=1;
for(p=G[pmin];p;p=p->next)
if(v[p->capat]==0)
if(d[p->capat]>d[pmin]+p->cost)
d[p->capat]=d[pmin]+p->cost;
}
}
for(j=1;j<=N;++j)
if(D[j]!=d[j])
break;
if(j<=N)
fout<<"NU\n";
else
fout<<"DA\n";
}
sterge();
}
fin.close();
fout.close();
return 0;
}
void adauga(int a,int b,int c)
{
nod *p=new nod;
p->capat=b;
p->cost=c;
p->next=G[a];
G[a]=p;
}
void sterge()
{
nod *p,*q;
int i;
for(i=1;i<=N;++i)
for(p=G[i];p;p=q)
{
q=p->next;
delete p;
}
for(i=1;i<=N;++i)
G[i]=NULL;
}