Cod sursa(job #2828589)

Utilizator IPCristianIlie Cristian IPCristian Data 7 ianuarie 2022 17:16:48
Problema Distante Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>

#define nr 50002

using namespace std;

int main()
{
    ifstream fin("distante.in");
    ofstream fout("distante.out");

    int nr_grafuri,n,m,sursa,rasp[nr],a,b,c,costuri[nr];
    vector<pair<int,int>> muchii[nr];
    queue<int> coada;

    fin>>nr_grafuri;
    for (int k=0;k<nr_grafuri;k++)
    {

        fin>>n>>m>>sursa;
        for (int i=1;i<=n;i++)
        {
            fin>>rasp[i];
            costuri[i] = 1001;
            coada.push(i);
        }

        for (auto& nod : muchii)
        {
            nod.clear();
        }

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

        costuri[sursa] = 0;
        while (!coada.empty())
        {
            int i = coada.front();
            int i_size = muchii[i].size();

            for (int j=0;j<i_size;j++)
            {
                int vecin = muchii[i][j].first;
                int cost = muchii[i][j].second;
                if (costuri[vecin] > costuri[i] + cost)
                {
                    coada.push(vecin);
                    costuri[vecin] = costuri[i]+cost;
                }
            }
            coada.pop();
        }

        int ok = 1;
        for (int i=1;i<=n;i++)
        {
            if (costuri[i] != rasp[i])
            {
                fout<<"NU\n";
                ok = 0;
                break;
            }
        }

        if (ok == 1)
        {
            fout<<"DA\n";
        }
    }

    fin.close();
    fout.close();

    return 0;
}