Cod sursa(job #2651028)

Utilizator anabatAna Batrineanu anabat Data 21 septembrie 2020 14:33:39
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>

using namespace std;

#define NMAX 50000
#define INF 1e9
#include <vector>
#include <queue>

struct edge{
  int to;
  long long cost;
  bool operator < (const edge &a) const {
    return (cost > a.cost);
  }
};

vector <edge> g[NMAX+1];
priority_queue <edge> q;
long long dist[NMAX+1],dist2[NMAX+1];

void dijkstra(int n,int nod){
  int i;
  for(i=1;i<=n;i++){
    dist[i]=INF;
  }
  for(auto next : g[nod]){
    q.push({next.to,next.cost});
  }
  dist[nod]=0;
  while(!q.empty()){
    edge next=q.top(); ///iau primul elem din coada
    q.pop();
    if(dist[next.to]==INF){ ///nu a fost parcurs nodul
      dist[next.to]=next.cost;
      for(auto elem : g[next.to]){
        q.push({elem.to,dist[next.to]+elem.cost});
      }
    }
  }
}

int main()
{
  FILE *fin,*fout;
  fin=fopen("distante.in","r");
  fout=fopen("distante.out","w");

  int T,n,m,sursa,x,y,z,i,j,OK;
  fscanf(fin,"%d",&T);
  for(i=1;i<=T;i++){
    OK=0;
    fscanf(fin,"%d%d%d",&n,&m,&sursa);
    for(j=1;j<=n;j++){
      fscanf(fin,"%d",&dist2[j]);
    }
    for(j=1;j<=m;j++){
      fscanf(fin,"%d%d%d",&x,&y,&z);
      g[x].push_back({y,z});
      g[y].push_back({x,z});
    }
    dijkstra(n,sursa);
    for(j=1;j<=n;j++){
      if(dist[j]!=dist2[j])
        OK=1;
    }
    if(OK==0)
      fprintf(fout,"DA\n");
    else
      fprintf(fout,"NU\n");
  }

  fclose(fin);
  fclose(fout);
  return 0;
}