Cod sursa(job #370981)

Utilizator vladiiIonescu Vlad vladii Data 2 decembrie 2009 22:04:17
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
const int INF=99999999;
int main() {
    fstream f1, f2;
    deque<pair<int, int> > G[50001];
    deque<int> Q;
    int d[50001], ei[50001], n, m, start, p, q, c, i, j, ok=1, k, t;
    bool InQueue[50001];
    f1.open("distante.in", ios::in);
    f2.open("distante.out", ios::out);
    f1>>t;
    for(j=1; j<=t; j++) {
         f1>>n>>m>>start;
         for(i=1; i<=n; i++) {
              f1>>ei[i];
              InQueue[i]=false; d[i]=INF;
         }
         for(i=1; i<=m; i++) {
              f1>>p>>q>>c;
              G[p].push_back(make_pair(q, c));
              G[q].push_back(make_pair(p, c));
         }
         d[start]=0;
         Q.push_back(start);
         InQueue[start]=true;
         while(!Q.empty()) {
              k=Q.front();
              Q.pop_front();
              InQueue[k]=false;
              for(deque<pair<int, int> >::iterator it=G[k].begin(); it!=G[k].end(); it++) {
                   p=(*it).first;
                   q=(*it).second;
                   if(d[p]>d[k]+q) {
                        d[p]=d[k]+q;
                        if(!InQueue[p]) { InQueue[p]=1; Q.push_back(p); }
                   }
              }
         }
         ok=1;
         for(i=1; i<=n; i++) {
              G[i].clear();
              if(ei[i]!=d[i]) {
                   ok=0;
              }
         }
         if(ok==0) { f2<<"NU"<<endl; }
         else { f2<<"DA"<<endl; }
    }
    f1.close(); f2.close();
    return 0;
}