Cod sursa(job #2347881)

Utilizator HelloWorldBogdan Rizescu HelloWorld Data 19 februarie 2019 10:43:03
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <limits.h>
#include <cstring>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int t,n,m,source,d[50001],dist[50001],i,j,z,x,y,cost,vecin;
vector < pair <int,int> > a[50001];
struct comparaDistante {
    bool operator()(int x,int y)
    {
        return dist[x]>dist[y];
    }
};
priority_queue <int,vector<int>,comparaDistante> pq;
bitset <50001> viz;
void infinity()
{
    for (int i=1;i<=n;++i)
         dist[i]=INT_MAX;
}
int main()
{
    in>>t;
    for (i=1;i<=t;++i)
    {
        int ok=0;
        in>>n>>m>>source;
        for (j=1;j<=n;++j)
             in>>d[j];
        for (j=1;j<=m;++j)
        {
            in>>x>>y>>cost;
            a[x].push_back(make_pair(y,cost));
            a[y].push_back(make_pair(x,cost));
        }
        infinity();
        dist[source]=0;
        pq.push(source);
        viz[source]=1;
        while (!pq.empty())
        {
            x=pq.top();
            viz[x]=0;
            for (z=0;z<a[x].size();++z)
            {
                vecin=a[x][z].first;
                cost=a[x][z].second;
                if (dist[x]+cost<dist[vecin])
                {
                    dist[vecin]=dist[x]+cost;
                    if (!viz[vecin])
                    {
                        viz[vecin]=1;
                        pq.push(vecin);
                    }
                }
            }
            pq.pop();
        }
        for (z=1;z<=n;++z)
        {
            if (dist[z]!=d[z])
            {
                ok=1;
                out<<"NU\n";
                break;
            }
        }
        if (!ok) out<<"DA\n";
        viz.reset();
        memset(a,0,sizeof a);

    }
}