Cod sursa(job #2206573)

Utilizator Andreea_DanielaAndreea Guster Andreea_Daniela Data 22 mai 2018 23:41:51
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <vector>
#include <set>
#include <stdlib.h>
#define INF 0x3f3f3f3f

using namespace std;

bool Dijkstra(int n, const vector< vector < pair<int, int> > >& la, int sursa, vector<int>dist)
{
    vector<int> d(n+1, INF);
    set< pair<int, int> > Q;
    int u, v;
    int w;

    d[sursa] = 0;
    Q.insert({d[sursa], sursa});

    while(!Q.empty())
    {
        u = Q.begin()->second;

        Q.erase(Q.begin());

        for(int i=0; i<la[u].size(); i++)
        {
            v = la[u][i].first;
            w = la[u][i].second;
            if( d[v] > (d[u] + w) )
            {
                if( Q.find({d[v], v}) != Q.end() )
                    Q.erase(Q.begin());

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

    for(int i=1; i<=n; i++)
    {
        if(d[i] != dist[i-1] )
            return false;
    }
    return true;
}


int main()
{
    int n, m, s, t;


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

    if( !f.is_open() || !g.is_open() )
       exit(EXIT_FAILURE);


      f >> t;
    for(int i=1; i<= t; i++)
    {
        vector< vector <pair<int,int> > > la;
        vector<int> dist;

       f >> n >> m >> s;

       la.resize(n+1);
       dist.resize(n+1);

       for(int j=0; j<n; j++)
       {
           int x;
           f >> x;
           dist[j] = x;
       }
       for(int j=1; j<=m; j++)
       {
           int x, y, c;
           f >> x >> y >> c;
           la[x].push_back({y,c});
           la[y].push_back({x,c});
       }

       if ( Dijkstra(n, la, s, dist) == true )
          g << "DA\n";
       else
        g << "NU\n";
    }

    f.close();
    g.close();
    return 0;
}