Pagini recente » Cod sursa (job #1814879) | Cod sursa (job #1738350) | Cod sursa (job #2155414) | Cod sursa (job #1854196) | Cod sursa (job #21840)
Cod sursa(job #21840)
#include <fstream.h>
#define Nmax 50001
#define Mmax 100001
#define INF 10000000
typedef struct Nod {
int inf,cost;
Nod * adr;
};
typedef struct Nod * Lista;
typedef long vect[Nmax];
vect d,s,dr;
Lista G[Nmax];
int n,m,ns,t;
void inserare(Lista &p,int x,int c)
{
Lista nou;
nou = new Nod;
nou->inf=x;
nou->cost=c;
nou->adr=p;
p=nou;
}
ofstream fout("distante.out");
void dijkstra();
void afisare();
void citire()
{
ifstream fin("distante.in");
int i,x,y,c,k;
fin>>t;
for(k=1;k<=t;k++)
{
fin>>n>>m>>ns;
for(i=1;i<=n;i++) {G[i]=NULL;fin>>dr[i];}
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
inserare(G[x],y,c);
}
dijkstra();
afisare();
}
fin.close();
}
int min()
{
long min=INF,i,mini;
for(i=1;i<=n;i++)
if(!s[i] && min>d[i])
{
min=d[i];
mini=i;
}
return mini;
}
int init()
{
int i;
for(i=1;i<=n;i++) s[i]=0,d[i]=INF;
Lista t;
t=G[ns];
while(t)
{
d[t->inf]=t->cost;
t=t->adr;
}
s[ns]=1;
d[ns]=0;
}
int det_cost(int x,int y)
{
Lista t;
t=G[x];
while(t)
{
if(t->inf==y) return t->cost;
t=t->adr;
}
return INF;
}
void dijkstra()
{
int ok=0,nrp=0,poz,j,cost;
init();
do{
poz=min();
nrp++;
if(nrp==n || d[poz]==INF) ok=1;
else
{
s[poz]=1;
for(j=1;j<=n;j++)
{
cost=det_cost(poz,j);
if(!s[j] && d[j]>d[poz]+cost) d[j]=d[poz]+cost;
}
}
}while(!ok);
}
void afisare()
{
int i,ok=1;
for(i=1;i<=n;i++) if(dr[i]!=d[i]) ok=0;
if(ok) fout<<"DA"<<'\n';
else fout<<"NU"<<'\n';
}
int main()
{
citire();
fout.close();
return 0;
}