Cod sursa(job #2349585)

Utilizator Alex221Dumitru Alexandru Alex221 Data 20 februarie 2019 16:25:26
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
#define maxn 100001
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector < pair< int, int> > v[maxn];
int n,m,t,dist[maxn],tata[maxn],s,d[maxn],a,b,c;
bool viz[maxn],ok;
struct cmp
{ bool operator()(int x, int y){ return dist[x]>dist[y];}

};
priority_queue<int, vector<int>, cmp> q;
void dijkstra( int start)
{ int nod, vecin, cost;
   for(int i=1;i<=n;i++)
        { dist[i]=INT_MAX;
          viz[i]=0;
        }
  dist[start]=0;
  q.push(start);
  while(!q.empty())
  { nod=q.top();
    q.pop();
    viz[nod]=0;
     for(int i=0;i<v[nod].size();i++)
     { vecin=v[nod][i].first;
       cost=v[nod][i].second;
       if(dist[nod]+cost<dist[vecin])
       { dist[vecin]=dist[nod]+cost;
          if(viz[vecin]==0)
          { viz[vecin]=1;
            tata[vecin]=nod;
            q.push(vecin);
          }
       }
     }
  }
}
int main()
{ f>>t;
  for(int i=1;i<=t;i++)
  { f>>n>>m>>s;
     ok=0;
     for(int j=1;j<=n;j++)
        f>>d[j];
     for(int j=1;j<=m;j++)
     { f>>a>>b>>c;
       v[a].push_back({b,c});
       v[b].push_back({a,c});
     }
    dijkstra(s);
    for(int j=1;j<=n && ok==0;j++)
        if(d[j]!=dist[j]) ok=1;
    if(ok==1) g<<"NU"<<'\n';
    else g<<"DA"<<'\n';
    for(int j=1;j<=n;j++)
        v[j].clear();
  }
    return 0;
}