Pagini recente » Cod sursa (job #2811092) | Cod sursa (job #2093048) | Cod sursa (job #1649089) | Cod sursa (job #1344971) | Cod sursa (job #1854558)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");
struct Pair
{
int node,dist;
bool operator < (const Pair& p) const
{
return dist>p.dist;
}
};
void ReadGraph();
void Dijkstra(int S,vector<int> & d);
bool Rezultat(vector<int> & d1,vector <int> & d2);
vector<vector<Pair>> G;
vector<int> d1;
vector<int> d2;
const int Inf=0x3f3f3f3f;
int n,m,s,T;
int main()
{
fi>>T;
while(T--)
{
ReadGraph();
Dijkstra(s,d2);
if (Rezultat(d1,d2)) fo<<"DA"<<'\n';
else fo<<"NU"<<'\n';
}
return 0;
}
void ReadGraph()
{
int x,y,w;
fi>>n>>m>>s;
G = vector<vector<Pair>>(n + 1,vector<Pair>(0));
d1=vector<int>(n+1,0);
d2=vector<int>(n+1,0);
for(int i=1; i<=n; i++) fi>>d1[i];
for(int i=1; i<=m; i++)
{
fi>>x>>y>>w;
G[x].push_back({y,w});
G[y].push_back({x,w});
}
}
void Dijkstra(int x, vector<int> & d)
{
priority_queue<Pair> Q;
d = vector<int>(n+1,Inf);
d[x]=0;
for(Q.push({x,0}); !Q.empty() ; Q.pop())
{
x = Q.top().node;
int dx = Q.top().dist;
if (dx > d[x]) continue;
for( auto & p : G[x] )
{
int y = p.node;
int w=p.dist;
if(d[y]> d[x]+w)
{
d[y]=d[x]+w;
Q.push({y,d[y]});
}
}
}
}
bool Rezultat(vector<int> & d1,vector <int> & d2)
{
for(int i=1; i<=n; i++)
if(d1[i] != d2[i]) return 0;
return 1;
}