Cod sursa(job #2505110)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 6 decembrie 2019 10:37:07
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

#define input "distante.in"
#define output "distante.out"
#define NMAX 50005
#define MUSC 100000005

using namespace std;

ifstream in(input);
ofstream out(output);

struct muchie
{
    int y, c;
};
vector < muchie > muchii[NMAX];
queue < int > coada;
int T, N, M, start_node, frecv[NMAX], cost[NMAX], dist[NMAX];
bool uz[NMAX];

void BellMan_FORD();

void Read_Data()
{
    in >> T;
    for(int t = 1; t <= T; t++)
    {
        in >> N >> M >> start_node;
        for(int i = 1; i <= N; i++)
        {
            muchii[i].clear();
            frecv[i] = 0; cost[i] = 0; dist[i] = MUSC;
            uz[i] = 0;
        }
        for(int i = 1; i <= N; i++)
            in >> cost[i];
        while(!coada.empty()) coada.pop();
        for(int i = 1; i <= M; i++)
        {
            int x, y, c; in >> x >> y >> c;
            muchii[x].push_back({y, c});
            muchii[y].push_back({x, c});
        }
        BellMan_FORD();
    }
}

void BellMan_FORD()
{
    coada.push(start_node);
    dist[start_node] = 0; frecv[start_node] = 1;
    bool valid = true;
    while(!coada.empty() && valid)
    {
        int nod = coada.front(); coada.pop(); uz[nod] = 0;
        int dist_nod = dist[nod];
        for(unsigned i = 0; i < muchii[nod].size(); i++)
        {
            int new_nod = muchii[nod][i].y;
            int new_dist = muchii[nod][i].c;
            if(dist[new_nod] > new_dist + dist_nod)
            {
                dist[new_nod] = new_dist + dist_nod;
                if(!uz[new_nod])
                {
                    uz[new_nod] = 1;
                    frecv[new_nod]++;
                    if(frecv[new_nod] > N)
                    {
                        valid = false;
                        break;
                    }
                    coada.push(new_nod);
                }
            }
        }
    }
    for(int i = 1; i <= N; i++)
        if(dist[i] != cost[i])
        {
            out << "NU\n";
            return;
        }
    out << "DA\n";
}

int main()
{
    Read_Data();
    return 0;
}