Pagini recente » Cod sursa (job #2242566) | Cod sursa (job #1245391) | Cod sursa (job #2834168) | Cod sursa (job #1706070) | Cod sursa (job #2640040)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
struct Costuri
{
int Nod1,Nod2,val;
} cost[5001];
int d[50001],vf[50001];
int nrGrafuri,n,m,s,a,b,CostMinim,q;
bool ok;
int Cost(int x, int y)
{
for (int i=1; i<=q; ++i)
if ((cost[i].Nod1 == x && cost[i].Nod2 == y) || ((cost[i].Nod1 == y && cost[i].Nod2 == x)))
return cost[i].val;
}
void Drum(vector <int> M[], int NodCurent, int CostCurent)
{
if (NodCurent == s && CostCurent < CostMinim)
{
CostMinim = CostCurent;
ok = true;
return;
}
for (int i=0; i<M[NodCurent].size() && !ok; i++)
{
int x=M[NodCurent][i];
if (!vf[x])
{
vf[x]=1;
Drum(M,x,CostCurent+Cost(NodCurent,x));
vf[x]=0;
}
}
}
int main(void)
{
cin >> nrGrafuri;
for (int i=0; i<nrGrafuri; ++i)
{
q=0;
cin >> n >> m >> s;
for (int j=1; j<=n; ++j)
cin >> d[j];
vector <int> M[n+1];
for (int j=0; j<m; ++j)
{
cin >> a >> b >> cost[++q].val;
cost[q].Nod1 = a;
cost[q].Nod2 = b;
M[a].push_back(b);
M[b].push_back(a);
}
bool OK = true;
for (int j=1; j<=n && OK; ++j)
{
ok = false;
CostMinim = 100000000;
if (j == s)
CostMinim = 0;
else
Drum(M,j,0);
if (CostMinim != d[j])
OK = false;
}
if (OK)
cout << "DA";
else
cout << "NU";
cout << '\n';
}
}