Cod sursa(job #2476793)

Utilizator filiptudose2007Tudose Filip filiptudose2007 Data 19 octombrie 2019 11:31:00
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int t,n,m,s,x,y,i,j,cost,d[50005],sol[50005];
bool sel[50005];
typedef pair<int,int> graf;
vector <graf>G[50005];
priority_queue<graf,vector<graf>,greater<graf>>Q;
void dijkstra(int pl)
{

    for(int i=1; i<=n; i++)
    {
        d[i]=INT_MAX;
        sel[i]=false;
    }
    sel[pl]=true;
    d[pl]=0;
    for(auto it : G[pl])
    {
        Q.push({it.first,it.second});
        d[it.second]=it.first;
    }
    while(!Q.empty())
    {
        while(!Q.empty() && sel[Q.top().second])Q.pop();
        if(Q.empty())return;
        graf k=Q.top();
        sel[k.second]=true;
        Q.pop();
        for(auto it : G[k.second])
        {
            if(k.first+it.first<d[it.second])
            {
                d[it.second]=k.first+it.first;
                Q.push({d[it.second],it.second});
            }
        }
    }
}
int main()
{
    f>>t;
    for(i=1; i<=t; ++i)
    {
        f>>n>>m>>s;
        for(j=1; j<=n; ++j)
        {
            sol[j]=0;
            f>>sol[j];
        }
        for(j=1; j<=n; ++j)G[j].clear();
        for(j=1; j<=m; ++j)
        {
            f>>x>>y>>cost;
            G[x].push_back({cost,y});
            G[y].push_back({cost,x});
        }
        dijkstra(s);
        for(j=1; j<=n; ++j)
        {
            if(sol[j]!=d[j])break;
        }
        if(j!=n+1)g<<"NU\n";
        else g<<"DA\n";
    }
    return 0;
}