Cod sursa(job #2197126)

Utilizator herbertoHerbert Mohanu herberto Data 21 aprilie 2018 11:02:27
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MAXN 50001
#define MAXM 100001
using namespace std;
set<pair<int,int> > s;
vector <pair<int, int> > g[MAXM];
int d[MAXN], d1[MAXN];
int n;

void dijkstra(int start){
  int u, v, costu, costv, i;
  for(i=1;i<=n;i++)
    d[i]=INF;

  d[start]=0;
  s.insert(make_pair(0,start));
  while(!s.empty()){
    u=s.begin()->second;
    costu=s.begin()->first;
//    printf("%d", u);
    s.erase(s.begin());
    for(i=0;i<g[u].size();i++){
//      printf("DA");
      v=g[u][i].second;
      costv=g[u][i].first;
      if(d[v]>d[u]+costv){
        if(d[v]!=INF)
          s.erase(s.find(make_pair(d[v],v)));

        d[v]=d[u]+costv;
        s.insert(make_pair(d[v],v));
      }
    }
  }
}

int main(){
  FILE*fin=fopen("distante.in", "r");
  FILE*fout=fopen("distante.out", "w");
  int i, t, ok, m, start, a, b, c;
  fscanf(fin, "%d", &t);
  while(t>0){
    fscanf(fin, "%d%d%d", &n, &m, &start);
//    printf("DA");
    for(i=1; i<=n; i++)
      fscanf(fin, "%d", &d1[i]);
    for(i=1;i<=m;i++){
      fscanf(fin, "%d%d%d",&a, &b, &c);
      g[a].push_back(make_pair(c, b));
      g[b].push_back(make_pair(c, a));
    }
    dijkstra(start);
    for(i=1; i<=n; i++)
      g[i].clear();
//    printf("DA");
    for(i=1; i<=n; i++)
      if(d[i]==INF)
        d[i]=0;

    ok=1;
    for(i=1;i<=n;i++)
      if(d[i]!=d1[i])
        ok=0;

    if(ok==1)
      fprintf(fout, "DA\n");
    else
      fprintf(fout, "NU\n");

    t--;
  }
    return 0;
}