Pagini recente » Cod sursa (job #1734815) | Cod sursa (job #1646016) | Cod sursa (job #1740627) | Cod sursa (job #1534186) | Cod sursa (job #2798671)
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include<bitset>
#include <map>
#include <cstring>
#include<algorithm>
#define MOD 1234567
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int n, m, s,gf;
long long int a[50003];
long long int dMin[50003];
bool viz[50003];
struct muchie
{
int dist;
int vecin;
};
vector<muchie> graf[50003];
void afis()
{
for (int j = 1; j <= n; j++)
{
fout<< dMin[j]<<" ";
}
fout<<"\n";
fout<<"\n\n\n";
}
void resetMat()
{
for (int i = 1; i <= n; i++)
{
dMin[i] = INT_MAX;
viz[i] = false;
}
}
void cautDrum(int s)
{
resetMat();
queue<int> q;
dMin[s] = 0;
q.push(s);
viz[s] = true;
//afis();
while (!q.empty())
{
int prec = q.front();
viz[prec] = false;
q.pop();
for (int i = 0; i<graf[prec].size(); i++)
{
int nod = graf[prec][i].vecin;
int dist = graf[prec][i].dist;
if (dMin[nod]> dMin[prec] + dist)
{
dMin[nod] = dMin[prec] + dist;
if (!viz[nod])
{
viz[nod] = true;
q.push(nod);
}
}
}
}
for(int i=1; i<=n; i++)
{
if(dMin[i]!=a[i])
{
fout<<"NU\n";
return;
}
}
fout<<"DA\n";
}
int main()
{
fin>>gf;
for(int i=1; i<=gf; i++)
{
fin>> n>> m>> s;
//graf.clear();
for (int j = 1; j <= n; j++)
{
fin>>a[j];
graf[j].resize(0);
}
for (int j = 1; j <= m; j++)
{
int x,y,d;
fin>>x>>y>>d;
muchie val;
val.dist=d;
val.vecin=y;
graf[x].push_back(val);
val.vecin=x;
graf[y].push_back(val);
}
cautDrum(s);
}
return 0;
}