Pagini recente » Cod sursa (job #1352051) | Cod sursa (job #1634830) | Cod sursa (job #457009) | Cod sursa (job #2247074) | Cod sursa (job #2051383)
#include<fstream>
#include<list>
#include<queue>
#include<string>
#include<bitset>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50005,INF=NMAX*1000;
struct graph{
int next_node,cost;
};
list<graph>g[NMAX];
int ans[NMAX],dist[NMAX],t,n,m,source_node;
bitset<NMAX>in_queue;
class cmp{
bool ok;
public:
bool operator()(const int &a,const int &b)const{
if(ok) return dist[a]<dist[b];
return dist[a]<dist[b];
}
};
void read_graph(){
int from,to,cost,i;
fin>>n>>m>>source_node;
for(i=1;i<=n;++i)
fin>>ans[i];
while(m--){
fin>>from>>to>>cost;
g[from].push_back({to,cost});
g[to].push_back({from,cost});
}
}
void dijkstra(){
int node;
priority_queue<int,vector<int>,cmp>pq;
pq.push(source_node);
fill(dist+1,dist+1+n,INF);
dist[source_node]=0;
list<graph>::iterator it;
while(!pq.empty()){
node=pq.top();
pq.pop();
in_queue[node]=false;
for(it=g[node].begin();it!=g[node].end();++it)
if(dist[it->next_node]>dist[node]+it->cost){
dist[it->next_node]=dist[node]+it->cost;
if(!in_queue[it->next_node]){
in_queue[it->next_node]=true;
pq.push(it->next_node);
}
}
}
}
string matching_results(){
int i;
for(i=1;i<=n;++i)
if(dist[i]!=ans[i])
return "NU";
return "DA";
}
void clear_graph(){
int i=1,j=n;
while(i<=j){
g[i].clear();
g[j].clear();
++i;
--j;
}
}
void solve(){
fin>>t;
while(t--){
read_graph();
dijkstra();
fout<<matching_results()<<'\n';
clear_graph();
}
}
int main(){
solve();
}