Cod sursa(job #2258786)

Utilizator mionelIon. M mionel Data 12 octombrie 2018 09:02:51
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
#define inf INT_MAX-10
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector < pair <int,int> > M[50001];
priority_queue < pair <int,int> > Q;
int n,m,s;
int D[50001],S[50001],P[50001],B[50001];
void Citire()
{ int i,a,b,c;
f>>n>>m>>s;
 for(i=1;i<=n;i++)
    f>>B[i];
 for(i=1;i<=m;i++)
 { f>>a>>b>>c;
     M[a].push_back(make_pair(b,c));
     M[b].push_back(make_pair(a,c));
 }
}
void Dijkstra()
{ int Start=s,poz,i,j,k,c;
    for(i=1;i<=n;i++)
    { D[i]=inf;
      S[i]=0;
      P[i]=0;
    }
   for(k=0;k<M[Start].size();k++)
   { j=M[Start][k].first;
     c=M[Start][k].second;
       D[j]=c;
       P[j]=Start;
    Q.push(make_pair(-c,j));
   }
D[Start]=0;
S[Start]=1;
 while(!(Q.empty()))
 {poz=Q.top().second;
     Q.pop();
     S[poz]=1;
     for(k=0;k<M[poz].size();k++)
     {j=M[poz][k].first;
    c=M[poz][k].second;
        if(S[j]==0&&D[j]>D[poz]+c)
        {D[j]=D[poz]+c;
         P[j]=poz;
         Q.push(make_pair(-D[j],j));
        }
 }
}
}
int main()
{int t,i,l,ok;
f>>t;
for(l=1;l<=t;l++)
{ Citire();
Dijkstra();
    ok=1;
    for(i=1;i<=n&&ok==1;i++)
        if(D[i]!=B[i])
          ok=0;
    if(ok==0)
        g<<"NU"<<endl;
    else g<<"DA"<<endl;
}
f.close();
g.close();
    return 0;
}