Cod sursa(job #2133983)

Utilizator eduardandrei20Nechifor Eduard Andrei eduardandrei20 Data 17 februarie 2018 15:14:17
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <bits/stdc++.h>
#define dim 50005
#define oo 1000000000
std::ifstream in("distante.in");
std::ofstream out("distante.out");
using namespace std;

bool FS();
int T,n,m;
vector< pair<int,int> >G[dim];
int ver[dim];
int D[dim];
bool viz[dim];
struct cmp
{
    bool operator()(int x,int y)
    {
        return D[x]>D[y];
    }
};

priority_queue< int , vector<int>, cmp>q;

void diji(int nod)
{
    viz[nod]=true;
    for(int i = 1; i<=n ;++i)
      if(i!=nod)D[i]=oo;
       else D[i]=0;
            q.push(nod);
              while(q.empty()==false)
              {
                  int NOD=q.top();
                      q.pop();
                          viz[NOD]=false;
                             for(size_t j=0; j<G[NOD].size();++j)
                             {
                                 int node=G[NOD][j].first;
                                 int cost=G[NOD][j].second;
                                          if(D[node]>D[NOD]+cost)
                                          {
                                              D[node]=D[NOD]+cost;
                                              if(!viz[node])
                                              {
                                                  q.push(node);
                                                  viz[node]=true;
                                              }
                                          }
                             }
              }
              //for(int i = 1; i <= n ; ++i)
                //cout << D[i]<<" ";
              //cout <<endl;
}



int main()
{
    int T,sursa;
                in >> T ;
                    for ( int i =1 ; i <= T ; ++i)
                    {  for(int qq=1;qq<=n;++qq)

                        G[qq].clear();
                        in >> n >> m >>sursa;
                           for (int j =1 ; j<=n ;++j)
                                         in>>ver[j];
                                        for(int j =1 ; j<=m ;++j)
                                        {
                                            int x,y,cost;
                                            in>>x>>y>>cost;
                                            G[x].push_back(make_pair(y,cost));
                                            G[y].push_back(make_pair(x,cost));
                                        }
                                        diji(sursa);
                                        if(FS())out<<"DA\n";
                                        else out<<"NU\n";
                    }


    return 0;
}

bool FS()
{
    for(int i =1; i<=n ;++i)
        if(D[i]!=ver[i])return false;
    return true;
}