Cod sursa(job #1619448)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 28 februarie 2016 16:14:34
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define oo 1<<30

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");
const int NMAX = 50001;
vector<pair<int,int> > muchii[NMAX];
bitset<NMAX> mark;
set<pair<int,int> > heap;
int n,m,t;
int values[NMAX];
int answer[NMAX];
int s;

void dijsktra()
{
    for(int i = 1;i<=n;i++)
        values[i] = oo;
    values[s] = 0;
    heap.insert(make_pair(0,s));
    while(heap.size() > 0)
    {
        int y = (*heap.begin()).second;
        int target,cost;
        heap.erase(heap.begin());
        for(unsigned int i=0;i<muchii[y].size();i++)
        {
           target = muchii[y][i].first;
           cost = muchii[y][i].second;
           if(values[target] > values[y] + cost)
            {
                values[target] = values[y] + cost;
                heap.insert(make_pair(values[target],target));
            }
        }
    }
}

int main()
{
    in>>t;
    for(int i=1;i<=t;i++)
    {
        in>>n>>m>>s;
        for(int i = 1;i<=n;i++)
            in>>answer[i];
        int x,y,z;
        for(int i=1;i<=m;i++)
        {
        in>>x>>y>>z;
        muchii[x].push_back(make_pair(y,z));
        muchii[y].push_back(make_pair(x,z));
        }
       dijsktra();
        int ok = 1;
        for(int i=1;i<=n;i++)
           if(values[i]!=answer[i])
           {
               ok = 0;
               break;
           }
           if(ok)
            out<<"DA\n";
           else
            out<<"NU\n";
       for(int i=1;i<=n;i++)
        muchii[i].clear();
    }
    in.close();
    out.close();
    return 0;
}