Pagini recente » Cod sursa (job #531154) | Cod sursa (job #1369593) | Cod sursa (job #3287935) | Cod sursa (job #1275681) | Cod sursa (job #1879888)
#include<stdio.h>
#include<vector>
#include<queue>
#define N 50000
#define INF 500000000
using namespace std;
struct Graf {
int node, lung;
};
struct Que {
int node,lung;
bool operator < (const Que &other)const{
return lung > other.lung;
}
};
FILE *in,*out;
int dist [N];
int rez[N];
void dijkstra (){
int n,i,m,nods,nod1,nod2,nod,l;
vector <Graf> v[N];
priority_queue <Que> heap;
//citire
fscanf(in,"%d%d%d",&n,&m,&nods);
for (i=1;i<=n;i++)
fscanf(in,"%d",&rez[i]);
for (i=1;i<=m;i++){
fscanf(in,"%d%d%d",&nod1,&nod2,&l);
v[nod1].push_back ({nod2,l});
v[nod2].push_back ({nod1,l});
}
//dijkstra
heap.push ({nods,0});
for (i=1;i<=n;i++)
dist[i] = INF;
dist[nods] = 0;
while (heap.empty() == 0){
nod = heap.top().node; l = heap.top().lung;
heap.pop();
if (l == dist[nod])
for (i=0; i < v[nod].size();i++){
l = dist[nod] + v[nod][i].lung;
if (l < dist[v[nod][i].node]){
dist[v[nod][i].node] = l;
heap.push({v[nod][i].node,l});/// node & dist
}
}
}
//verif rezultate
int pp = 0;
for (i=1;i<=n && pp == 0;i++){
if (dist[i] == INF)
dist[i] = 0;
if (dist[i] != rez[i])
pp = 1;
}
//afis
if (pp == 0)
fprintf (out,"DA\n");
else
fprintf (out,"NU\n");
}
int main (){
in = fopen ("distante.in","r");
out = fopen ("distante.out","w");
int t,q;
fscanf(in,"%d",&t);
for (q=1;q<=t;q++){
dijkstra ();// include citirea & afis
}
fclose (in);
fclose (out);
return 0;
}