Cod sursa(job #798003)

Utilizator alexalbu95Albu Alexandru alexalbu95 Data 15 octombrie 2012 15:11:11
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

const int inf=16000000;
const int maxn=50001;

vector< pair<int, int> >::iterator it;
vector< pair<int, int> > v[maxn];
queue<int> q;

int t, x, y, z, n, m, s, i, d[maxn], a[maxn];
bool block[maxn];

void compute(int s)
{
    int x;

    d[s]=0;
    q.push(s);
    block[s]=1;

    while(!q.empty())
    {
        x=q.front();
        q.pop();
        block[x]=0;

        for(it=v[x].begin(); it!=v[x].end(); ++it)
            if(d[it->first] > it->second + d[x])
            {
                d[it->first] = it->second + d[x];
                if(!block[it->first])
                {
                    q.push(it->first);
                    block[it->first]=1;
                }
            }
    }

}

int main()
{
    f>>t;

    for(; t; --t)
    {
        f>>n>>m>>s;
        for(i=1; i<=n; ++i)
        {
            v[i].clear();
            f>>a[i];
            d[i]=inf;
            block[i]=0;
        }
        for(; m; --m)
        {
            f>>x>>y>>z;
            v[x].push_back(make_pair(y, z));
            v[y].push_back(make_pair(x, z));
        }
        compute(s);
        bool ok=1;
        for(i=1; i<=n; ++i)
            if(d[i]!=a[i]) ok=0;
        if(ok==0) g<<"NU\n";
        else g<<"DA\n";
    }
}