Cod sursa(job #2823476)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 28 decembrie 2021 17:06:58
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>

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

int n,m,s;
vector<vector<pair<int,int>>> muchii; //lista de adiacenta
vector<int> sol;
vector<int> sol_corecta;

vector<int> Dijkstra(int s)
{
    ///complexitate: O(m * logn)

    vector<int> viz(n+1,0); //pentru a marca nodurile prin care trecem
    vector<int> d; //distanta de la s la celelalte noduri
    const int inf = 1e9;

    //min heap cu sortare dupa distanta (primul element)
    priority_queue <pair<int,int>, vector<pair<int,int>>, greater<pair<int, int>>> dist_nod;

    //initializarea
    d.resize(n+1);
    for(int i=1; i<=n; ++i)
    {
        if(i!=s)
            d[i]=inf;
        else
        {
            d[i]=0;
            dist_nod.push(make_pair(d[i],i)); //adaug doar nodul sursa in heap initial
        }
    }

    while (!dist_nod.empty())
    {
        int u=dist_nod.top().second; //extrage nodul cu eticheta minima (distanta minima)
        dist_nod.pop();

        if(!viz[u])
        {
            viz[u]=1;

            for(int i=0; i<(int)muchii[u].size(); ++i) //caut nodurile v pentru care exista muchia uv
            {
                int v,cost;

                v=muchii[u][i].first;
                cost=muchii[u][i].second; //dintre u si v

                //verific daca pot relaxa muchia (il folosesc pe u ca intermediar)
                if(d[v] > d[u] + cost)
                {
                    d[v]=d[u]+cost; //actualizez distanta
                    dist_nod.push(make_pair(d[v],v));
                }

            }
        }
    }
    return d;
}

bool Verifica(vector<int>& a, vector<int>& b)
{
    if(a.size()!=b.size())
        return 0;

    for(int i=0; i<(int)a.size(); ++i)
        if(a[i]!=b[i])
            return 0;

    return 1;
}

int main()
{
    int t,a,b,c;

    fin>>t;
    for(int i=0; i<t; ++i)
    {
        fin>>n>>m>>s;

        sol.clear();
        sol.resize(n+1);
        for(int j=1; j<=n; ++j)
            fin>>sol[j];

        muchii.clear();
        muchii.resize(n+1);

        for(int j=0; j<m; ++j)
        {
            fin>>a>>b>>c;
            muchii[a].push_back(make_pair(b,c));
            muchii[b].push_back(make_pair(a,c));
        }

        sol_corecta=Dijkstra(s);

        if(Verifica(sol,sol_corecta))
            fout<<"DA\n";
        else
            fout<<"NU\n";

    }

    return 0;
}