Pagini recente » Cod sursa (job #2398710) | Cod sursa (job #2172630) | Cod sursa (job #1319589) | Cod sursa (job #1443638) | Cod sursa (job #211465)
Cod sursa(job #211465)
#include <fstream>
#define MAX 50010
#define infinit 100000000
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
struct nod
{
int inf,cost;
nod *next;
};
typedef struct nod nod;
nod * sir[MAX];
int n,m,vi;
int d[MAX],viz[MAX],T[MAX],final[MAX],numar;
void adauga(int a,int b,int c)
{
nod *q=new nod;
q->inf=a;
q->cost=c;
q->next=sir[b];
sir[b]=q;
}
void citire()
{
fin>>n>>m>>vi;
int a,b,c;
for (int i=1;i<=n;i++)
fin>>final[i];
for (int i=0;i<m;i++)
{
fin>>a>>b>>c;
adauga(a,b,c);
adauga(b,a,c);
}
}
void prima_faza()
{
for (nod *r=sir[vi];r;r=r->next)
if (d[r->inf]==infinit||(d[r->inf]>d[vi]+r->cost))
{
d[r->inf]=d[vi]+r->cost;
T[r->inf]=vi;
}
}
void dijkstra()
{
memset(T,0,sizeof(T));
memset(viz,0,sizeof(viz));
for (int i=0;i<=n;i++)
d[i]=infinit;
d[vi]=0;
viz[vi]=1;
T[vi]=0;
prima_faza();
int poz,min;
for (int p=1;p<=n;p++)
{
min=infinit;
for (int i=1;i<=n;i++)
if (viz[i]==0 && d[i]<min)
{ min=d[i];
poz=i;
}
if (min==infinit)
return ;
viz[poz]=1;
for (nod *r=sir[poz];r;r=r->next)
if (d[r->inf]==infinit||(d[r->inf]>d[poz]+r->cost))
{
d[r->inf]=d[poz]+r->cost;
T[r->inf]=poz;
}
}
}
void afisare()
{
int ok=1;
for (int i=1;i<=n;i++)
if (d[i]!=final[i])
ok=0;
if (ok)
fout<<"DA";
else
fout<<"NU";
fout<<"\n";
}
int main()
{
int t;
fin>>t;
while(t)
{
citire();
dijkstra();
afisare();
t--;
}
return 0;
}