Cod sursa(job #2033506)

Utilizator tanasaradutanasaradu tanasaradu Data 6 octombrie 2017 21:41:56
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50001;
const int inf=(1<<30);
priority_queue<pair<int,int> >c;
vector<pair<int,int> >L[NMAX];
int n,m,query,dist[NMAX],distinit[NMAX],varf;
bitset<NMAX>viz;
inline void Reset()
{
    viz.reset();
    for(int i=1;i<=n;i++)
        L[i].clear();
    while(!c.empty())
        c.pop();
    for(int i=1;i<=n;i++)
        dist[i]=0;
}
inline void Dijkstra(int nod)
{
    for(int i=1;i<=n;i++)
        dist[i]=inf;
    dist[nod]=0;
    c.push({0,nod});
    while(!c.empty())
    {
        int x=c.top().second;
        c.pop();
        if(!viz[x])
        {
            viz[x]=1;
            for(int i=0;i<L[x].size();i++)
            {
                int p=L[x][i].first;
                int q=L[x][i].second;
                if(dist[p]>dist[x]+q)
                {
                    dist[p]=dist[x]+q;
                    c.push({-dist[p],p});
                }
            }
        }
    }
}
inline bool Check()
{
    int i;
    for(i=1;dist[i]==distinit[i] && i<=n;i++)
            ;
    return (i>n);
}
inline void Read_Solve()
{
    fin>>query;
    for(int i=1;i<=query;i++)
    {
        fin>>n>>m>>varf;
        for(int j=1;j<=n;j++)
            fin>>distinit[j];
        for(int j=1;j<=m;j++)
        {
            int nod,nod1,cost;
            fin>>nod>>nod1>>cost;
            L[nod].push_back({nod1,cost});
            L[nod1].push_back({nod,cost});
        }
        Dijkstra(varf);
        bool sol=Check();
        if(sol)
            fout<<"DA\n";
        else fout<<"NU\n";
        Reset();
    }
}
int main()
{
    Read_Solve();
    fin.close();
    fout.close();
    return 0;
}