Cod sursa(job #2040040)

Utilizator LauraNaduLaura Nadu LauraNadu Data 15 octombrie 2017 12:55:16
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <vector>
#include <set>
#define inf 214700000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int n, m, i, k, sol[50002], x, y, t, c, cost, vd[50002], d[50002], nod, vecin, costv;
bool viz[50002];
set<pair<int, int> > heap;
int main()
{
    f>>t;
    while(t!=0)
    {
        vector<pair<int, int> > l[100002];
        f>>n>>m>>k;
        for(i=1;i<=n;i++)
        {
            f>>vd[i];
            viz[i]=0;
        }
        while(!heap.empty())
            heap.erase(heap.begin());
        for(i=1;i<=m;i++)
        {
            int x, y, c;
            f>>x>>y>>c;
            l[x].push_back(make_pair(y, c));
            l[y].push_back(make_pair(x, c));
        }
        for(i=1;i<=n;i++)
            d[i]=inf;
        d[k]=0;
        heap.insert(make_pair(0, k));
        while(!heap.empty())
        {
            nod=heap.begin()->second;
            cost=heap.begin()->first;
            viz[nod]=1;
            heap.erase(heap.begin());
            for(vector< pair<int, int> > :: iterator it=l[nod].begin(); it!=l[nod].end(); it++)
            {
                vecin=it->first;
                costv=it->second;
                if(d[vecin]>costv+cost && viz[vecin]==0)
                {
                    heap.erase(make_pair(d[vecin], vecin));
                    d[vecin]=costv+cost;
                    heap.insert(make_pair(d[vecin], vecin));
                }
            }
        }
        for(i=1;i<=n;i++)
            if(i!=k && vd[i]!=d[i])
            {
                g<<"NU\n";
                break;
            }
        if(i==n+1)
            g<<"DA\n";
        t--;
    }
    return 0;
}