Cod sursa(job #2290375)

Utilizator alexkosaAlex Kosa alexkosa Data 26 noiembrie 2018 13:54:21
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <climits>
#include <vector>
#include <set>

using namespace std;

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

int t,n,m,sol[50003],s,dist[50003];

vector<pair<int,int> >g[50003];

multiset<pair<int,int> >heap;

void dijkstra(int x)
{
    heap.insert(make_pair(0,x));
    while(!heap.empty())
    {
        int from=heap.begin()->second;
        heap.erase(heap.begin());
        for(vector<pair<int,int> > :: iterator it=g[from].begin();it!=g[from].end();it++)
        {
            int to=it->first;
            int cost=it->second;
            if(dist[to]>dist[from]+cost)
            {
                if(dist[to]!=INT_MAX)
                    heap.erase(heap.find(make_pair(dist[to],to)));
                dist[to]=dist[from]+cost;
                heap.insert(make_pair(dist[to],to));
            }
        }
    }
}

int main()
{
    fin>>t;
    for(int c=1;c<=t;c++)
    {
        fin>>n>>m>>s;

        for(int i=1;i<=n;i++)
            {fin>>sol[i];
            dist[i]=INT_MAX;
            }
            dist[s]=0;
        for(int i=1;i<=m;i++)
        {
            int x,y,a;
            fin>>x>>y>>a;
            g[x].push_back(make_pair(y,a));
            g[y].push_back(make_pair(x,a));
        }
       dijkstra(s);
        dist[s]=0;
        int ok=1;
        for(int i=1;i<=n;i++)
           {
               if(dist[i]!=sol[i])
            {
                ok=0;
                break;
            }
           }
        if(ok==0)
            fout<<"NU"<<'\n';
        else
            fout<<"DA"<<'\n';
        for(int i=1;i<=n;i++)
            g[i].clear();



    }
}