Cod sursa(job #2146125)

Utilizator vladrares10Raducu Vlad-Rares vladrares10 Data 27 februarie 2018 20:12:17
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <cstring>

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

const int INF = 0x3f3f3f3f;
const int NMAX = 50002;

int T;

void Read();
void Solve();

int main()
{
    Read();

    return 0;
}

void Read()
{
    fin >> T; /// citim cate cazuri avem de rezolvat
    for(int i = 1; i <= T; i++)
        Solve();
}

void Solve()
{
    int n,m,start;
    int sablon[NMAX];

    fin >> n >> m >> start; /// citim nr de noduri,muchii si vf de start

    /// citim distantele sablon care trebuie verificate
    for(int i = 1; i <= n; i++)
        fin >> sablon[i];

    vector < pair<int,int> > G[NMAX]; /// creem graful
    for(int i = 1; i <= m; i++)
    {
        int from,to,cost;
        fin >> from >> to >> cost;

        G[from].push_back( make_pair(cost,to) );
        G[to].push_back( make_pair(cost,from) );
    }

    ///creem vectorul de dist si il initializam cu INF//
    int dist[NMAX];
    memset(dist, INF, sizeof dist);
    ///

    dist[start] = 0;
    set< pair<int,int> > heap;
    heap.insert(make_pair(0,start)); /// creem heap-ul si introducem prima muchie


    while(!heap.empty())
    {
        int d = heap.begin()->first;
        int node = heap.begin()->second;
        heap.erase(heap.begin());
        ///am extras urmatorul nod pt care se va calcula distanta minima

        for(vector < pair<int,int> >::iterator it = G[node].begin(); it != G[node].end(); ++it)
        {
            int cost = it ->first;
            int to = it ->second;

            if(dist[to] > dist[node] + cost)
            {
                if(dist[to] != INF)
                    heap.erase(heap.find(make_pair(dist[to],to)));
                /// daca distanta pana la nodul "to" e dif de INF o stergem deoarece am gasit o solutie mai optima

                dist[to] = dist[node] + cost;
                heap.insert(make_pair(dist[to],to));
                /// actualizam solutia optima si o introducem in heap;
            }
        }

    }

    for(int i = 1; i <= n; i++)
        if(dist[i] == INF)
            dist[i] = 0;

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

    if(ok)
        fout << "DA" << endl;



}