Cod sursa(job #1926425)

Utilizator matystroiaStroia Matei matystroia Data 14 martie 2017 12:50:48
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

const int N=50005, INF=0x3F3F3F3F;

int n, m, t, s, dmin[N];
vector<pair<int,int>> a[N];

vector<int> dijkstra(int n, int s, vector <pair<int,int>> ad[])
{
    priority_queue<pair<int,int>> pq;
    pq.push(make_pair(0, s));
    vector<int> d(n+1,INF);
    d[s]=0;

    while(pq.size())
    {
        int nod=pq.top().second;
        int dist=-pq.top().first;
        pq.pop();

        if(dist!=d[nod])
            continue;

        for(pair<int,int> v:ad[nod])
        {
            if(d[nod]+v.second<d[v.first])
            {
                d[v.first]=d[nod]+v.second;
                pq.push(make_pair(-d[v.first], v.first));
            }
        }
    }

    return d;
}

int main()
{
    fin>>t;
    for(int k=0;k<t;++k)
    {
        fin>>n>>m>>s;
        for(int i=1;i<=n;++i)
            fin>>dmin[i];
        for(int i=0;i<m;++i)
        {
            int x, y, z;
            fin>>x>>y>>z;
            a[x].push_back(make_pair(y, z));
            a[y].push_back(make_pair(x, z));
        }

        bool ok=true;
        vector<int> d;
        d=dijkstra(n, s, a);
        for(int i=1;i<=n;++i)
            if(d[i]!=dmin[i])
            {
                ok=false;
                break;
            }
        if(ok)fout<<"DA\n";
        else fout<<"NU\n";
    }
    return 0;
}