Cod sursa(job #2120843)

Utilizator lorena1999Marginean Lorena lorena1999 Data 2 februarie 2018 23:03:22
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <climits>
#define MAX 50001
#define INF INT_MAX

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int k, n, m, sursa, dist[MAX], d[MAX];

vector < pair < int , int > > v[MAX];

priority_queue < pair < int , int > > heap;

bitset < MAX > viz;

void init()
    {
        for(int i=1; i<=n; i++)
            d[i]=INF;
    }

void init_viz()
    {
        for(int i=1; i<=n; i++)
            viz[i]=0;
    }

bool djk();

void read()
    {
        f>>k;
        for(int i=1; i<=k; i++)
        {
            init();
            f>>n>>m>>sursa;
            for(int j=1; j<=n; j++)
                f>>dist[j];
            int x, y, lungime;
            for(int j=1; j<=m; j++)
            {
                f>>x>>y>>lungime;
                v[x].push_back(make_pair(y, lungime));
                v[y].push_back(make_pair(x, lungime));
            }

            if(djk()==true)
                g<<"DA"<<endl;
            else g<<"NU"<<endl;
            init_viz();

        }
    }

bool djk()
    {
        heap.push(make_pair(0, sursa));
        d[sursa]=0;
        while(!heap.empty())
        {
            int node = heap.top().second;
            heap.pop();
            if(viz[node]==0)
            {
                viz[node]=1;
                for(size_t i=0; i<v[node].size(); i++)
                {
                    int p = v[node][i].second;
                    int q = v[node][i].first;
                    if(d[p]>d[node]+q)
                    {
                        d[p]=d[node]+q;
                        heap.push(make_pair(-d[p], p));
                    }
                }
            }
            if(d[node]==INF && d[node]!=0)
                return false;
            if(dist[node]!=d[node])
                {
                    return false;
                }
        }
        return true;

    }

int main()
{
    read();

    f.close();
    g.close();

    return 0;
}