Pagini recente » Cod sursa (job #2341602) | Cod sursa (job #729381) | Cod sursa (job #1308273) | Cod sursa (job #607707) | Cod sursa (job #2505110)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define input "distante.in"
#define output "distante.out"
#define NMAX 50005
#define MUSC 100000005
using namespace std;
ifstream in(input);
ofstream out(output);
struct muchie
{
int y, c;
};
vector < muchie > muchii[NMAX];
queue < int > coada;
int T, N, M, start_node, frecv[NMAX], cost[NMAX], dist[NMAX];
bool uz[NMAX];
void BellMan_FORD();
void Read_Data()
{
in >> T;
for(int t = 1; t <= T; t++)
{
in >> N >> M >> start_node;
for(int i = 1; i <= N; i++)
{
muchii[i].clear();
frecv[i] = 0; cost[i] = 0; dist[i] = MUSC;
uz[i] = 0;
}
for(int i = 1; i <= N; i++)
in >> cost[i];
while(!coada.empty()) coada.pop();
for(int i = 1; i <= M; i++)
{
int x, y, c; in >> x >> y >> c;
muchii[x].push_back({y, c});
muchii[y].push_back({x, c});
}
BellMan_FORD();
}
}
void BellMan_FORD()
{
coada.push(start_node);
dist[start_node] = 0; frecv[start_node] = 1;
bool valid = true;
while(!coada.empty() && valid)
{
int nod = coada.front(); coada.pop(); uz[nod] = 0;
int dist_nod = dist[nod];
for(unsigned i = 0; i < muchii[nod].size(); i++)
{
int new_nod = muchii[nod][i].y;
int new_dist = muchii[nod][i].c;
if(dist[new_nod] > new_dist + dist_nod)
{
dist[new_nod] = new_dist + dist_nod;
if(!uz[new_nod])
{
uz[new_nod] = 1;
frecv[new_nod]++;
if(frecv[new_nod] > N)
{
valid = false;
break;
}
coada.push(new_nod);
}
}
}
}
for(int i = 1; i <= N; i++)
if(dist[i] != cost[i])
{
out << "NU\n";
return;
}
out << "DA\n";
}
int main()
{
Read_Data();
return 0;
}