Pagini recente » Cod sursa (job #1688754) | Cod sursa (job #163213) | Cod sursa (job #2143026) | Cod sursa (job #994561) | Cod sursa (job #2113529)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct Nod
{
int nod, cost;
};
vector <Nod> l[100001];
int n,m,s1,t1,d1[100001],d[100001],s[100001],t[100001];
void dijkstra(int r)
{
int i;
for(i=1;i<=n;i++)
d[i]=999;
vector <Nod> :: iterator it=l[r].begin();
while(it!=l[r].end())
{
d[(*it).nod]=(*it).cost;
t[(*it).nod]=r;
it++;
}
d[r]=0;
t[r]=0;
for(i=1;i<=n;i++)
s[i]=0;
s[r]=1;
int i0;
for(int k=2;k<=n;k++)
{
int Min=9999;
for(i=1;i<=n;i++)
if(s[i]==0 && Min>=d[i])
{
Min=d[i];
i0=i;
}
s[i0]=1;
vector <Nod> :: iterator jt=l[i0].begin();
while(jt!=l[i0].end())
{
if(d[(*jt).nod]>Min+(*jt).cost)
{
d[(*jt).nod]=Min+(*jt).cost;
t[(*jt).nod]=i0;
}
jt++;
}
}
}
int verif()
{
for (int i = 1; i <= n; i++)
if (d[i] != d1[i])
return 0;
return 1;
}
int main()
{
fin>>t1;
while(t1)
{
t1--;
fin>>n>>m>>s1;
int i,j;
for(i=1;i<=n;i++)
fin>>d1[i];
for(i=1;i<=n;i++)
{
vector <Nod> :: iterator it=l[i].begin();
vector <Nod> :: iterator jt=l[i].end();
l[i].erase(it,jt);
}
for(i=1;i<=m;i++)
{
int a,b,c;
fin>>a>>b>>c;
Nod x;
x.cost=c;
x.nod=b;
l[a].push_back(x);
x.nod=a;
l[b].push_back(x);
}
dijkstra(s1);
if(verif()==0)
fout<<"NU\n";
else
fout<<"DA\n";
}
return 0;
}