Cod sursa(job #1435261)

Utilizator EpictetStamatin Cristian Epictet Data 12 mai 2015 18:25:19
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <vector>
#include <set>
#include <cstring>
#include <string>
#define Max_Value 0x3f3f3f3f
#define Max_Nodes 50010
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int T, N, M, S, My_Dist[Max_Nodes], His_Dist[Max_Nodes];
vector < pair < int, int > > V[Max_Nodes];
multiset < pair < int, int > > Heap;
string Sol;

void Read_Data();
void Initialization();
void Dijkstra();
void Reset_Vector(vector < pair < int, int > > []);
void Verif();

int main()
{
    fin >> T;
    while (T--)
    {
        Read_Data();
        Initialization();
        Dijkstra();
        Verif();
        fout << Sol;
    }

    return 0;
}

void Read_Data()
{
    fin >> N >> M >> S;
    for (int i = 1; i <= N; i++) {
        fin >> His_Dist[i];
    }

    Reset_Vector(V);
    for (int i = 1, x, y, c; i <= M; i++) {
        fin >> x >> y >> c;
        V[x].push_back( { y, c } );
        V[y].push_back( { x, c } );
    }
}

void Initialization()
{
    memset(My_Dist, Max_Value, sizeof(My_Dist));
    My_Dist[S] = 0;
    Heap.insert( { 0, S } );
}

void Dijkstra()
{
    while (!Heap.empty())
    {
        pair < int, int > nod = *Heap.begin();
        Heap.erase(nod);

        for (vector < pair < int, int > > :: iterator it = V[nod.second].begin(); it != V[nod.second].end(); it++)
        {
            if (My_Dist[nod.second] + it->second < My_Dist[it->first])
            {
                Heap.erase( { My_Dist[it->first], it->first } );
                My_Dist[it->first] = My_Dist[nod.second] + it->second;
                Heap.insert( { My_Dist[it->first], it->first } );
            }
        }
    }
}

void Reset_Vector(vector < pair < int, int > > A[])
{
    for (int i = 1; i <= N; i++) {
        A[i].clear();
    }
}

void Verif()
{
    Sol = "DA\n";
    for (int i = 1; i <= N; i++) {
        if (My_Dist[i] != His_Dist[i]) {
            Sol = "NU\n";
            break;
        }
    }
}