Cod sursa(job #2695406)

Utilizator DariusGhercaDarius Gherca DariusGherca Data 12 ianuarie 2021 21:13:05
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <vector>
#include <climits>
#include <bitset>
#include <queue>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int N=5e4+10;
const int infinit=INT_MAX;
struct pct{
    int nod,cost;
};
vector <pct> a[N];
void dijkstra(int nod,int dist[],int n)
{
    int cost, i, nod1, nod2;
    for (i = 1; i<= n; i++)
        dist[i] = infinit;

    priority_queue<pct> dist_min;
    bitset <N> f;
    dist[nod] = 0;
    pct aux;
    aux.cost=0;
    aux.nod=nod;
    dist_min.push(aux);
    while (dist_min.size() > 0)
    {
        nod1 = dist_min.top().nod;
        dist_min.pop();
        if(f[nod1] == 0)
        {
            f[nod1] = 1;
            for (i = 0; i < a[nod1].size(); i++)
            {
                nod2 = a[nod1][i].nod;
                cost = a[nod1][i].cost;
                if (dist[nod1] + cost < dist[nod2])
                {
                    dist[nod2] = dist[nod1] + cost;
                    pct aux;
                    aux.nod=nod2;
                    aux.cost=-dist[nod2];
                    dist_min.push(aux);
                }
            }
        }
    }
}
void rezolvare()
{
    int rez1[N],rez2[N];
    int n,m,s;
    f>>n>>m>>s;
    for(int i=1;i<=n;i++)
    {
        int x;
        f>>x;
        rez1[i]=x;
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        f>>x>>y>>z;
        pct aux;
        aux.nod=y;
        aux.cost=z;
        a[x].push_back(aux);
        aux.nod=x;
        a[y].push_back(aux);
    }
    dijkstra(s,rez2,n);
    for(int i=1;i<=n;i++)
    {
        a[i].clear();
    }
    for(int i=1;i<=n;i++)
    {
        if(rez1[i]!=rez2[i])
        {
            g<<"NU"<<"\n";
            return;
        }
    }
    g<<"DA"<<"\n";
    return;
}
int main()
{
    int t;
    f>>t;
    while(t)
    {
        rezolvare();
        t--;
    }
    return 0;
}