Cod sursa(job #2671597)

Utilizator MRobertMMartis Robert Marian MRobertM Data 12 noiembrie 2020 13:47:40
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <string.h>

using namespace std;

#define NMAX 1001
#define inf 100001

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

int dist[NMAX],viz[NMAX],sum[NMAX],dist_init[NMAX];

struct comp{

    bool operator()(int x, int y)
    {
        return dist[x] > dist[y];
    }
};

vector <pair <int,int> > G[NMAX];

priority_queue<int, vector <int>, comp> q;

int main()
{
    int n,m,x,y,i,c,nod_start,curent,vecin,cost,graf;
    int T;

    char corect[3];

    fin>>T;

    for(graf=1;graf<=T;graf++)
    {
        strcpy(corect,"DA");

        fin>>n>>m>>nod_start;

        for(i=1;i<=n;i++)
        {
            fin>>dist_init[i];
        }
        for(i=1;i<=m;i++)
        {
            fin>>x>>y>>c;

            G[x].push_back(make_pair(y,c));
            G[y].push_back(make_pair(x,c));
        }
        for(i=1;i<=n;i++)
        {
            dist[i]=inf;
        }
        for(i=1;i<=n;i++)
        {
            viz[i]=0;
        }

        dist[nod_start]=0;
        viz[nod_start]=1;

        q.push(nod_start);

        while(!(q.empty()))
        {
            curent=q.top();
            viz[curent]=1;

            q.pop();

            for(i=0;i<G[curent].size();i++)
            {
                vecin=G[curent][i].first;
                cost=G[curent][i].second;

                if(dist[curent]+cost<dist[vecin])
                    dist[vecin]=dist[curent]+cost;
                if(viz[vecin]==0)
                {
                    q.push(vecin);
                    viz[vecin]=1;
                }
            }
        }

        for(i=1;i<=n;i++)
        {
            if(dist[i]!=dist_init[i])
            {
                strcpy(corect,"NU");
            }
        }

        fout<<corect<<'\n';
    }

    return 0;
}