Cod sursa(job #866471)

Utilizator mvcl3Marian Iacob mvcl3 Data 28 ianuarie 2013 09:12:18
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
#include<queue>
#include<vector>
using namespace std;

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

const int NMAX = 50001;
long long INF = 1000000000;
int t, n, m, varf;
long long bcp[NMAX], sol[NMAX];

struct nod
{
    int v;
    int c;
    nod(){};
    nod(int a, int b)
    {
        v = a;
        c = b;
    };
};

vector<nod> v[NMAX];
queue<int> q;

inline void read_data();
inline void cmp_data();
inline void solve(int);

int main()
{
    INF = INF * INF;
    f>>t;
    while(t--)
    {
        read_data();
        solve(varf);
        cmp_data();
    }
    g.close();
    return 0;
}

inline void read_data()
{
    f>>n>>m>>varf;
    int x, y, cost;
    for(int i = 1; i <= n; ++i) f>>bcp[i], sol[i] = INF;
    for(int i = 1; i <= m; ++i)
    {
        f>>x>>y>>cost;
        v[x].push_back(nod(y, cost));
        v[y].push_back(nod(x, cost));
    }
}

inline void solve(int k)
{
    q.push(k);
    sol[k] = 0;
    while(!q.empty())
    {
        k = q.front(), q.pop();
        vector<nod>::iterator it;
        for(it = v[k].begin(); it != v[k].end(); ++it)
        {
            if((*it).c + sol[k] < sol[(*it).v])
            {
                sol[(*it).v] = (*it).c + sol[k];
                q.push((*it).v);
            }
        }
    }
}

inline void cmp_data()
{
    for(int i = 1; i <= n; ++i)
    {
        if(sol[i] == INF) sol[i] = 0;
        if(sol[i] != bcp[i])
        {
            g<<"NU"<<'\n';
            return;
        }
    }

    g<<"DA"<<'\n';
}