Cod sursa(job #1879888)

Utilizator Mstar_AngelComan Mara Stefania Mstar_Angel Data 15 februarie 2017 11:00:08
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#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;
}