Cod sursa(job #2120858)

Utilizator lorena1999Marginean Lorena lorena1999 Data 2 februarie 2018 23:29:23
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 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++)
        {


            f>>n>>m>>sursa;
            init();
            init_viz();
            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;


        }
    }

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].first;
                    int q = v[node][i].second;
                    //cout<<d[p]<<" "<<d[node]<<" "<<q<<endl;
                    if(d[p]>d[node]+q)
                    {
                        d[p]=d[node]+q;
                        heap.push(make_pair(-d[p], p));
                    }
                }
            }

        }
        /*for(int i=1; i<=n; i++)
            cout<<d[i]<<" ";
        cout<<endl;*/
        for(int i=1; i<=n; i++)
            if(dist[i]!=d[i] || d[i]==INF && dist[i]!=0)
                {
                    return false;
                }
        return true;
    }

int main()
{
    read();

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

    return 0;
}