Pagini recente » Cod sursa (job #680882) | Cod sursa (job #1408929) | Cod sursa (job #184745) | Cod sursa (job #770760) | Cod sursa (job #1209633)
#include <fstream>
#include <vector>
#include <queue>
#define MX 50001
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct muc
{
int j,c;
};
vector<muc> v[MX];
int r1[MX], r2[MX], t, n, m, s;
struct comp
{
bool operator() (int a, int b)
{
return r2[a] > r2[b];
}
};
priority_queue<int, vector<int>, comp> q;
void citire()
{
fin>>n>>m>>s;
int i,x,y,c;
muc e;
for(i=1; i<=n; i++) fin>>r1[i];
for(i=1; i<=m; i++)
{
fin>>x>>y>>c;
e.j = y;
e.c = c;
v[x].push_back(e);
e.j = x;
v[y].push_back(e);
}
}
void init()
{
int i;
for(i=1; i<=n; i++) r2[i] = 2000000000;
r2[s] = 0;
}
void dijkstra()
{
q.push(s);
vector<muc>::iterator it;
int u;
muc e;
while(!q.empty())
{
u = q.top();
q.pop();
for(it=v[u].begin(); it!=v[u].end(); it++)
{
e = *it;
if(r2[u] + e.c < r2[e.j])
{
r2[e.j] = r2[u] + e.c;
q.push(e.j);
}
}
}
}
void tipar()
{
int i;
for(i=1; i<=n; i++)
{
if(r1[i] != r2[i])
{
fout<<"NU\n";
return;
}
}
fout<<"DA\n";
}
int main()
{
int i,j;
fin>>t;
for(i=1; i<=t; i++)
{
citire();
init();
dijkstra();
tipar();
for(j=1; j<=n; j++) v[j].clear();
}
fin.close(); fout.close();
return 0;
}