Cod sursa(job #2231342)

Utilizator Andreea_DanielaAndreea Guster Andreea_Daniela Data 13 august 2018 21:19:10
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <set>

#define infinit 0x3f3f3f
using namespace std;

ofstream fout("distante.out");
int n, m, s; //n= nr noduri, s = sursa,  m= nr muchii
int dist[50000];  //dist minime calculate de bronzel

void Dijkstra( const vector < vector< pair <int, int> > > &);

void citire()
{
    ifstream fin ("distante.in");
    if( !fin.is_open() || !fout.is_open() )
    {
        cout << "The file didn't open!\n";
        exit (EXIT_FAILURE);
    }

    int t; //cate grafuri sunt pe foaie
    fin >> t;
    for(int j=1; j<=t; j++)
    {
        vector< vector <pair <int, int> > > la;
        fin >> n >> m >> s;

    for(int i=1; i<=n; i++)
        fin >> dist[i];

    la.resize(n+1);
    for(int i=1; i<=m; i++)
    {
        int u, v, w;
        fin >> u >> v >> w;

        la[u].push_back({v, w});
        la[v].push_back({u, w});
    }


//    cout << "the graph given is:\n";
//    for(int i=1; i<=n; i++)
//    {   cout << i << ": ";
//        for(int k=0; k< la[i].size(); k++)
//            cout << la[i][k].first << "/" << la[i][k].second << " ";
//        cout << endl;
//    }
    //cout << "the source is: " << s;

    Dijkstra(la);
    }


    fin.close();
    fout.close();
}

void Dijkstra(const vector < vector< pair <int, int> > > &la)
{
    vector<int> d(n+1, infinit);
    vector<int> tata(n+1, 0);
    set<pair<int,int>> min_heap;

    d[s] = 0;
    min_heap.insert({d[s], s});

    while(!min_heap.empty())
    {
        int u = min_heap.begin()->second;
        min_heap.erase( min_heap.begin() );

        for(int i=0; i<la[u].size(); i++)
        {
            int v = la[u][i].first;
            int w = la[u][i].second;

            if( d[v] > d[u] + w)
            {
                if( min_heap.find({d[v], v}) != min_heap.end() )
                    min_heap.erase( {d[v], v} );

                d[v] = d[u] + w;
                min_heap.insert({d[v], v});
            }
        }
    }

//    cout << endl << "the distances are: ";
//    for(int i=1; i<=n; i++)
//        if( d[i] == infinit )
//        { d[i] = 0; cout << 0 << " ";}
//        else
//          cout<< d[i] << " ";
//    cout << endl;



    int ok = 1;
    for(int i=1; i<=n; i++)
    {
        if( dist[i] != d[i] && d[i] != infinit )
        {
            fout << "NU\n";
            ok = 0;
            break;
        }
    }

    if(ok == 1)
        fout << "DA\n";
}
int main()
{
    citire();

    return 0;
}