Pagini recente » Cod sursa (job #1357974) | Cod sursa (job #1886957) | Cod sursa (job #1951892) | Cod sursa (job #1769819) | Cod sursa (job #2829197)
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
struct compare{
bool operator()(const pair<int,int> &a, const pair<int,int> &b){
return a.second>b.second; //compar dupa cost
}
};
int T; //cat grafuri sunt pe foaie;
int n,m,s;
int d[50001];
vector<pair<int,int>> v[50001]; //de ex 1: (2,3) unde 3 este costul
priority_queue<pair<int,int>,vector<pair<int,int>>,compare>heap;
int x,y,cost;
int dist[50001],viz[50001];
void add(int node1,int node2,int cost){
v[node1].push_back(make_pair(node2,cost));
}
void dijkstra(int node){
viz[node]=1;
for(int i=0;i<v[node].size();i++){
if(viz[v[node][i].first]==0) //parcurg lista de adiacenta si vad daca a fost vizitat fiecare nod
//bag in heap (u,v,cost(u,v))
{
heap.push(make_pair(v[node][i].first,v[node][i].second+dist[node]));
}
}
while(heap.size()!=0){
pair<int,int> top;
top=heap.top();
heap.pop();
if(viz[top.first]== 0) //u e in apm, dar v nu
{
dist[top.first]=top.second;
dijkstra(top.first);
}
}
}
int main(){
int ok=1;
f>>T;
f>>n>>m>>s;
for(int i=0;i<n;i++)
{
f>>d[i];
}
while(T>0) {
for (int i = 0; i < m; i++) {
f >> x >> y >> cost;
add(x, y, cost);
}
for (int i = 0; i < n; i++) {
dist[i] = 0;
}
dijkstra(s);
for (int i = 0; i < n; i++) {
if (dist[i] != d[i])
ok = 0;
}
if (ok == 0)
g << "NU";
else
g << "DA";
g<<'\n';
T--;
for(int i=1;i<=n;i++)
{
v[i].clear();
}
for(int i=0;i<=n;i++)
viz[i]=0;
while(heap.size() !=0)
{
heap.pop();
}
}
}