Cod sursa(job #2546349)

Utilizator Daria09Florea Daria Daria09 Data 14 februarie 2020 09:13:25
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define dim 50005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
struct zaharel
{
    int cost,node;
    bool operator <(const zaharel & other) const
    {
        return cost>other.cost;
    }
};
struct bronzarel
{
    int cost,node;
};
priority_queue <zaharel> q;
vector <bronzarel> graph[dim];
int n,m,s,d[dim],dist[dim];
void Init()
{
    for(int i=1; i<=n; ++i)
    {
        graph[i].clear();
    }
}
void Read()
{
    f>>n>>m>>s;
    for(int i=1; i<=n; ++i)
        f>>d[i];
    for(int i=1; i<=m; ++i)
    {
        int x,y,c;
        f>>x>>y>>c;
        graph[x].push_back({c,y});
        graph[y].push_back({c,x});
    }
}
void Dijkstra()
{
    for(int i=1; i<=n; ++i)
        dist[i]=-1;
    dist[s]=0;
    q.push({0,s});
    while(!q.empty())
    {
        int node=q.top().node;
        int cost=q.top().cost;
        q.pop();
        if(cost!=dist[node])
            continue;
        for(int i=0; i<graph[node].size(); ++i)
        {
            int son=graph[node][i].node;
            int costt=graph[node][i].cost;
            if(dist[son]==-1||dist[son]>dist[node]+costt)
            {
                dist[son]=dist[node]+costt;
                q.push({dist[son],son});
            }
        }
    }
}
void Write()
{
    for(int i=1; i<=n; ++i)
        if(dist[i]!=d[i])
        {
            g<<"NU\n";
            return;
        }
    g<<"DA\n";
}
int main()
{
    int t;
    f>>t;
    for(int i=1; i<=t; ++i)
    {
        Init();
        Read();
        Dijkstra();
        Write();
    }
    return 0;
}