Cod sursa(job #2039380)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 14 octombrie 2017 15:10:57
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
vector<pair <int, int> > v[50003];
priority_queue< pair<int, int> , vector<pair<int, int> >, greater<pair<int, int> > > q;
int n, m, i, a, b, c, cost, el , d[50003],s , t[50003],x,aux[50003];

void sterge()
{
    for(int i=1;i<=n;i++)
    {
        while(v[i].size()>0)
            v[i].pop_back();
    }
}

int main()
{
    fin>>x;
    while(x>0)
    {
        fin>>n>>m>>s;
        for(i=1;i<=n;i++)
        {
            fin>>aux[i];
            d[i]=10000000;
            t[i]=0;
        }
        d[s]=0;
        for(i=1;i<=m;i++)
        {
            fin>>a>>b>>c;
            v[a].push_back(make_pair(b, c));
            v[b].push_back(make_pair(a, c));
        }
        for(i=0;i<v[s].size();i++)
        {
            q.push(make_pair(v[s][i].second, v[s][i].first));
            t[v[s][i].first]=s;
        }
        int nr=n-1;
        while(nr>0)
        {
            cost=q.top().first;
            el=q.top().second;
            q.pop();
            if(d[el]>cost)
            {
                for(i=0;i<v[el].size();i++)
                    if(t[el]!=v[el][i].first)
                    {
                        q.push(make_pair(v[el][i].second+cost, v[el][i].first));
                        t[v[el][i].first]=el;
                    }
                nr--;
                d[el]=cost;
            }
        }
        while(q.size()>0)
            q.pop();
        int ok=1;
        for(i=1;i<=n;i++)
        {
            a=aux[i];
            if(a!=d[i])
                ok=0;
        }
        sterge();
        if(ok==0)
            fout<<"NU\n";
        else
            fout<<"DA\n";
        x--;
    }
    fin.close();
    fout.close();
    return 0;
}