Cod sursa(job #2206578)

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

using namespace std;

vector<int> Dijkstra(int n, const vector< vector < pair<int, int> > >& la, int sursa)
{
    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});
            }
        }
    }

  return d;
}


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++)
           f >> dist[j];

       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});
       }
       vector <int > d;
       d = Dijkstra(n, la, s);
       bool mistake = false;

       for(int j=0; j < n; j++)
        if( d[j+1] != dist[j] )
       {
           mistake = true;
           break;
       }

       if ( !mistake )
          g << "DA\n";
       else
          g << "NU\n";
    }

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