Cod sursa(job #2070624)

Utilizator GeorgeCalinPetruta George-Calin GeorgeCalin Data 19 noiembrie 2017 19:20:50
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#define nmax 50002
#define infinit 100000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

struct duet{
    int vecin,cost;
};

class cmp{
public:
    bool operator() (duet A,duet B)
    {
        if(A.cost==B.cost)
        {
            return A.vecin>B.vecin;
        }
        return A.cost>B.cost;
    }
};

int distanta[nmax];
int distanta_calculata[nmax];
priority_queue <duet,vector <duet>,cmp> coada;
bitset <nmax> vizitat;
vector <duet> graf[nmax];

int main()
{
    int nr_teste,n,m,start,x,y,c;
    fin>>nr_teste;
    for(int pas=nr_teste;pas;pas--)
    {
        fin>>n>>m>>start;
        for(int i=1;i<=n;i++)
        {
            vizitat[i]=0;
            distanta[i]=infinit;
        }
        for(int i=1;i<=n;i++)
        {
            fin>>distanta_calculata[i];
        }
        for(int i=1;i<=m;i++)
        {
            fin>>x>>y>>c;
            duet ac;
            ac.vecin=y;
            ac.cost=c;
            graf[x].push_back(ac);
            ac.vecin=x;
            graf[y].push_back(ac);
        }
        distanta[start]=0;
        coada.push({start,0});
        while(!coada.empty())
        {
            int nod=coada.top().vecin;
            int costa=coada.top().cost;
            coada.pop();
            if(vizitat[nod]==0){
            for(int i=0;i<graf[nod].size();i++)
            {
                if(distanta[graf[nod][i].vecin]>costa+graf[nod][i].cost)
                {
                    distanta[graf[nod][i].vecin]=costa+graf[nod][i].cost;
                    coada.push({graf[nod][i].vecin,distanta[graf[nod][i].vecin]});
                }
            }
            }
            vizitat[nod]=1;
        }
        int conditie=0;
        for(int i=1;i<=n;i++)
        {
            if(distanta[i]!=distanta_calculata[i]){
                conditie=1;break;
            }
        }
        if(conditie)
            fout<<"NU\n";
        else
            fout<<"DA\n";
    }
    return 0;
}