Pagini recente » Cod sursa (job #1998750) | Cod sursa (job #1814150) | Cod sursa (job #958708) | Cod sursa (job #1573212) | Cod sursa (job #2152733)
#include <fstream>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct nod {
int vec;
int c;
nod* urm;
};
typedef nod* LSI;
int n, m, start;
int T;
int d[50010];
LSI L[50010];
void inserare(LSI& L,int x, int y, nod* p);
void citire();
void initializare(int n);
bool verificare();
int main()
{
citire();
return 0;
}
void citire()
{int T, ok;
int i, j, x, y, cost;
fin>>T;
for(i=1; i<=T; i++)
{
fin>>n>>m>>start;
initializare(n);
for(j=1; j<=n; j++)
//citim distantele d
fin>>d[j];
for(j=1; j<=m; ++j)
{ //acum muchiile
fin>>x>>y>>cost;
inserare(L[x], y, cost, NULL);
inserare(L[y], x, cost, NULL);
}
ok=verificare();
if (ok==0)
fout<<"NU"<<'\n';
else
fout<<"DA"<<'\n';
}
}
void initializare(int n)
{
int i;
for(i=1; i<=n; i++)
L[i]=NULL;
}
bool verificare()
{
int i;
nod *p;
bool verif;
if(d[start]!=0)
return 0;
for(i=1; i<=n; ++i)
if(i!=start)
{
verif=0;
for (p=L[i]; p!=NULL; p=p->urm)
if(d[i]>d[p->vec]+p->c)
return 0;
else
if(d[i]==d[p->vec]+p->c)
verif=1;
//distantele calculate pot fi si mai mici; trebuie sa fim 100% siguri ca rezultatul este corect!
if(verif==0)
return 0;
}
return 1;
}
void inserare(LSI& L,int x, int cost, nod* p)
{
nod* q;
q=new nod;
q->vec=x;
q->c=cost;
if (p==NULL)
{
q->urm=L;
L=q;
}
else
{
q->urm=p->urm;
p->urm=q;
}
}