Cod sursa(job #2308918)

Utilizator victorv88Veltan Victor victorv88 Data 27 decembrie 2018 23:53:08
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#define MAX (1<<27)

using namespace std;

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

int t, n, m, sursa, d_calc[50005], sol[50005], from, to, cost, dp[50005];

struct drum{
    int nod;
    int cost;
};

vector<drum>graph[50005];

bool operator<(drum a, drum b)
{
    if (a.cost==b.cost)
        return a.nod<b.nod;
    return a.cost<b.cost;
}

set<drum>q;

void citire()
{
    f >> n >> m >> sursa;
    for (int i=1; i<=n; i++)
        f >> d_calc[i], dp[i]=MAX;
    for (int i=1; i<=m; i++)
    {
        f >> from >> to >> cost;
        graph[from].push_back({to,cost});
        graph[to].push_back({from,cost});
    }
}

void afisare()
{
    for (int i=1; i<=n; i++)
    {
        if (dp[i]!=d_calc[i])
        {
            g << "NU\n";
            return;
        }
    }
    g << "DA\n";
}

void rezolvare()
{
    q.insert({sursa,0});
    dp[sursa]=0;
    while (!q.empty())
    {
        int nod = q.begin()->nod;
        int cost = q.begin()->cost;
        q.erase(q.begin());
        for (auto &v:graph[nod])
        {
            if (dp[nod]+v.cost<dp[v.nod])
            {
                if (dp[v.nod]!=MAX)
                    q.erase({v.nod,dp[v.nod]});
                dp[v.nod]=dp[nod]+v.cost;
                q.insert({v.nod,dp[v.nod]});
            }
        }
    }
    afisare();
    for (int i=1; i<=n; i++)
    {
        dp[i]=MAX;
        graph[i].erase(graph[i].begin(),graph[i].end());
    }
}

int main() {
    f >> t;
    for (int tes=1; tes<=t; tes++)
    {
        citire();
        rezolvare();
    }
    return 0;
}