Cod sursa(job #1706676)

Utilizator TimoteiCopaciu Timotei Timotei Data 22 mai 2016 23:12:11
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>

#define inf 1 << 30
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n, m, node, D[50005], a, new_node, bestD[50005], T;
struct lista{
  int vecin, dist;
}x;
vector <lista> v[50005];
queue <int> C;
//bitset <50005> is_in_tail;
void bfs(int x){
   C.push(x);
   bestD[x] = 0;
  while(!C.empty()){
    node = C.front();
    //is_in_tail[node] = 0;
    C.pop();
    for(int i = 0; i < v[node].size(); ++i){
        new_node = v[node][i].vecin;
        if(bestD[node] + v[node][i].dist < bestD[new_node]){
            bestD[new_node] = bestD[node] + v[node][i].dist;
           // if(!is_in_tail[new_node]){
             C.push(new_node);
             //is_in_tail[new_node] = 1;
            //}
        }
    }
  }
}
int is_ok(){
  for(int i = 1; i <= n; ++i)
    if(D[i] != bestD[i]) return 0;
    return 1;
}
void read()
{
  fin >> T;
  for(int j = 1; j <= T; ++j){
    fin >> n >> m >> node;
    for(int i = 1; i <= n; ++i)
        fin >> D[i];
    for(int i = 1; i <= m; ++i){
        fin >> a >> x.vecin >> x.dist;
        v[a].push_back(x);
        swap(a, x.vecin);
        v[a].push_back(x);
    }
    //C.push(node);
    //is_in_tail[node] = 1;
    for(int i = 1; i <= n; ++i)
        bestD[i] = inf;
    //bestD[node] = 0;
    bfs(node);
    if(is_ok()) fout << "DA\n";
      else fout << "NU\n";
  }
}
int main()
{
    read();
    return 0;
}