Cod sursa(job #1092008)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 ianuarie 2014 14:28:43
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 50099
#define Mmax 100099
#define oo 2000000000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");

int T,N,M,S,d[Nmax],v[Nmax];

struct muchie{int nod,c;};
vector < muchie > Graph[Nmax];

struct cmp
{
    bool operator()(const int &a,const int &b)
    {
        return (d[a]>d[b]);
    };
};
priority_queue < int , vector < int > , cmp > pq;

int Dijkstra(const int &S)
{
    for(int i=1;i<=N;++i)d[i]=oo;
    d[S]=0;
    pq.push(S);
    for( ; !pq.empty() ; pq.pop())
    {
        int x=pq.top();
        for(vector<muchie>::iterator it=Graph[x].begin();it!=Graph[x].end();++it)
            if(d[x]+it->c < d[it->nod])
            {
                d[it->nod]=d[x]+it->c ;
                pq.push(it->nod);
            }
    }
    for(int i=1;i<=N;++i)
        {
            if(d[i]==oo)d[i]=0;
            if(d[i]!=v[i])return 0;
        }
    return 1;
}

void ReadInput()
{
    f>>N>>M>>S;
    for(int i=1;i<=N;++i)f>>v[i];
    for(int i=1;i<=M;++i)
    {
        int x,y,c; muchie aux;
        f>>x>>y>>aux.c;
        aux.nod=y; Graph[x].push_back(aux);
        aux.nod=x; Graph[y].push_back(aux);
    }
}

int main()
{
    f>>T;
    for(int i=1;i<=T;++i)
    {
        ReadInput();
        if(Dijkstra(S))g<<"DA\n";
        else g<<"NU\n";
        for(int j=1;j<=N;++j)Graph[j].clear();
    }
    f.close();g.close();
    return 0;
}