Cod sursa(job #1113709)

Utilizator ard_procesoareLupicu ard_procesoare Data 20 februarie 2014 20:37:07
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define NMAX 50005
#define INF 99999999
vector <int> v[NMAX],cost[NMAX];
queue <int> q;
int n,m,a,b,s;
int d[NMAX],sol[NMAX];
bool viz[NMAX],ever[NMAX];
void reset()
{

    for(int i=1;i<=n;i++)
    {
        d[i]=INF;
        v[i].clear();
        cost[i].clear();
        viz[i] = ever[i] = false;
    }
}
int minim(int a,int b)
{
    if(a<b) return a;
    return b;
}
void solve()
{
    int a,b,c,nod;
    fin>>n>>m>>s;
    if(d[1] == 0) for(int i=1;i<=n;i++) d[i] = INF; //init
    d[s] = 0;
    for(int i=1;i<=n;i++)
        fin>>sol[i];
    for(int i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        v[a].pb(b);
        v[b].pb(a);
        cost[b].pb(c);
        cost[a].pb(c);
    }
    q.push(s);
    int y;
    while(!q.empty())
    {
        nod = q.front();
        ever[nod] = true;
        q.pop();
        for(int i=0;i<v[nod].size();i++)
        {
            y = v[nod][i];
            if(ever[y] == false || d[y] > d[nod] + cost[nod][i])
            {
                if(viz[y] == false)
                    q.push(y);
                ever[y] = true;
                viz[y] = true;
                d[y] = d[nod] + cost[nod][i];
                if(d[y] < sol[y]) { fout<<"NU\n"; return;}
            }
        }
        viz[nod] = false;
    }
   // for(int i=1;i<=n;i++) fout<<d[i]<<" ";fout<<endl;  //test
    for(int i=1;i<=n;i++)
        if(d[i] != sol[i]) { fout<<"NU\n"; return;}
    fout<<"DA\n";}
int main()
{
    int t;
    fin>>t;
    solve();
    for(int i=1;i<t;i++)
    {
        reset();
        solve();
    }
}