Cod sursa(job #952090)

Utilizator marialivia16Chiorean Maria Livia marialivia16 Data 22 mai 2013 18:10:19
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include<iostream>
#include <fstream>
#include<vector>
#include<queue>
#include<cstdio>
#include<algorithm>
#define lim 60000
#define inf 1<<30
using namespace std;
class distante {
    int t,n,m,s;
    int dist[lim],fr[lim];
    bool incoada[lim];
    struct muchie
    {
        int nod;
        int cost;
    };
    vector<muchie> G[lim];
    queue<int> coada;
    fstream in,out;
public:
    distante(string fin,string fout)
    {
        in.open(fin.c_str(), ios::in);
        out.open(fout.c_str(), ios::out);
    }
    ~distante()
    {
        in.close();
        out.close();
    }
    void bf()
    {
        int cost,x,y;
        bool ok=true;
        coada.push(s);
        for(int i=1;i<=n;i++)
        {
            dist[i]=inf;
            fr[i]=0;
            incoada[i]=false;
        }
        dist[s]=0;
        incoada[s]=true;
        while(ok && !coada.empty())
        {
            x=coada.front();
            coada.pop();
            incoada[x]=false;
            for(int i=0;i<G[x].size();i++)
            {
                y=G[x][i].nod;
                cost=G[x][i].cost;
                if(dist[x]+cost<dist[y])
                {
                    dist[y]=dist[x]+cost;
                    if(!incoada[y])
                    {
                        if(fr[y]>n)
                            ok=false;
                        else
                        {
                            coada.push(y);
                            incoada[y]=1;
                            fr[y]++;
                        }
                    }
                }
            }
        }

    }
    void solve()
    {
        in>>t;
        muchie a,b;
        bool ok;
        int d[lim];
        while(t--)
        {
            in>>n>>m>>s;

            for(int i=1;i<=n;i++)
            {
                in>>d[i];
            }
            for(int i=1;i<=m;i++)
            {
                in>>a.nod>>b.nod>>b.cost;
                G[a.nod].push_back(b);
                a.cost=b.cost;
                G[b.nod].push_back(a);
            }
            if(d[s]==0)
            {
                bf();
                ok=true;
                for(int i=1;i<=n;i++)
                {
                    if(d[i]!=dist[i])
                    {
                        out<<"NU"<<endl;
                        i=n;
                        ok=false;
                    }
                }
                if(ok==true)
                {
                    out<<"DA"<<endl;
                }
            }
            else
            {
                out<<"NU"<<endl;
            }
        }
    }
};
int main()
{
    distante X("distante.in","distante.out");
    X.solve();
    return 0;
}