Cod sursa(job #1162097)

Utilizator sergiunascaSergiu Nasca sergiunasca Data 31 martie 2014 17:10:57
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
#define NMax 50003
#define INF 1<<28
using namespace std;
ifstream fin("distanta.in");
ofstream fout("distanta.out");
int n,m,s,t,x;
int nod1,nod2,cost,d[NMax];
std::vector<int> a,g[NMax],c[NMax];
bool dijkstra(int x)
{
    std::queue< std::pair<int,int> > coada;
    fill(d+1,d+n+1,INF);
    d[x] = 0;
    coada.push(std::make_pair(x,0));
    while(coada.empty()==0)
    {
        int val = (coada.front()).second;
        int nod = (coada.front()).first;
        coada.pop();
        for(int i=0;i<g[nod].size();++i)
        {
            if(d[g[nod][i]] > val + c[nod][i])
            {
                d[g[nod][i]] = val + c[nod][i];
                coada.push( std::make_pair(g[nod][i],d[g[nod][i]]) );
            }
        }
    }
    for(int i=1;i<=n;++i)if(d[i]!=a[i])return 1;
    return 0;
}
int main()
{
    fin>>t;
    for(int k=1;k<=t;++k)
    {
        fin>>n>>m>>s;
        a.push_back(0);
        for(int i=1;i<=n;++i)
        {
            fin>>x;
            a.push_back(x);
            g[i].clear();
            c[i].clear();
        }
        for(int i=1;i<=m;++i)
        {
            fin>>nod1>>nod2>>cost;
            g[nod1].push_back(nod2);
            c[nod1].push_back(cost);
            g[nod2].push_back(nod1);
            c[nod2].push_back(cost);
        }
        if(dijkstra(s)==1)fout<<"NU"<<'\n';
        else fout<<"DA"<<'\n';
        a.clear();
    }
    return 0;
}