Cod sursa(job #2818343)

Utilizator PopescuMihneaPopescu Mihnea-Valentin PopescuMihnea Data 15 decembrie 2021 21:08:56
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>
#include <vector>
#define inf INT_MAX-10000
using namespace std;

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

void dijkstra(unsigned int n, unsigned int m,unsigned int s, vector<vector<pair<int,int>>> lista_vecini, int cf[])
{
    unsigned int i;
    int d[n+1];
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> coada_noduri;
    for (i=1; i<=n; ++i)
    {
        d[i]=inf;
    }
    d[s]=0;
    coada_noduri.push(make_pair(0,s));
    while (!coada_noduri.empty())
    {
        int nod=coada_noduri.top().second;
        coada_noduri.pop();
        for (int i=0; i<lista_vecini[nod].size(); ++i)
        {
            int nod_dest=lista_vecini[nod][i].first;
            int cost_dest=lista_vecini[nod][i].second;
            if (d[nod]+cost_dest<d[nod_dest])
            {
                d[nod_dest]=d[nod]+cost_dest;
                coada_noduri.push(make_pair(d[nod_dest],nod_dest));
            }

        }

    }
    bool ok=true;
    for (unsigned int i=1; i<=n; ++i)
    {
        if (d[i]!=cf[i])
        {
            g<<"NU";
            ok=false;
            break;
        }
    }

    if (ok)
        g<<"DA";
    g<<"\n";
}

int main()
{
    int t,n,m,s,i,j;
    f>>t;
    for (i=0; i<t; ++i)
    {
        vector<vector<pair<int,int>>> lista_vecini;
        f>>n>>m>>s;
        lista_vecini.resize(n+1);
        int cf[n+1];
        for (j=1; j<=n; ++j)
            f>>cf[j];
        for (j=0; j<m; ++j)
        {
            int x,y,c;
            f>>x>>y>>c;
            lista_vecini[x].push_back(make_pair(y,c));
            lista_vecini[y].push_back(make_pair(x,c));
        }
        dijkstra(n, m, s, lista_vecini, cf);
    }
}