Cod sursa(job #1334697)

Utilizator rsteliRadu Stelian rsteli Data 4 februarie 2015 16:30:30
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");

#define nmax 50010
#define inf 2000000010
#define mp make_pair
#define pb push_back

int t,n,m,s,dMin[nmax],d[nmax],x,y,c,ok;
vector<pair<int,int> > g[nmax];
queue<int> q;
bitset<nmax> v;

void bf(int sursa)
{
    int i,j,x,nod,cost;
    vector<pair<int,int> >::iterator it;
    for (i=1;i<=n;i++)
        d[i]=inf;
    d[sursa]=0;
    v.set(sursa);
    q.push(sursa);
    while (!q.empty())
    {
        x=q.front();
        q.pop();
        v.reset(x);
        for (it=g[x].begin();it!=g[x].end();it++)
        {
            nod=(*it).first;
            cost=(*it).second;
            if (d[nod]>d[x]+cost)
            {
                d[nod]=d[x]+cost;
                if (v.test(nod)==false)
                {
                    v.set(nod);
                    q.push(nod);
                }
            }
        }
    }
}

int main()
{
    int i,j;
    cin>>t;
    for (;t;t--)
    {
        cin>>n>>m>>s;
        for (i=1;i<=n;i++)
            cin>>dMin[i];
        for (i=1;i<=m;i++)
        {
            cin>>x>>y>>c;
            g[x].pb(mp(y,c));
            g[y].pb(mp(x,c));
        }
        bf(s);
        ok=1;
        for (i=1;i<=n;i++)
            if (dMin[i]!=d[i])
            {
                ok=0;
                break;
            }
        if (ok) cout<<"DA"<<'\n';
        else cout<<"NU"<<'\n';
        if (t>1)
        {
            for (i=1;i<=n;i++)
                g[x].clear();
            v.reset();
        }
    }
}