Cod sursa(job #952073)

Utilizator marialivia16Chiorean Maria Livia marialivia16 Data 22 mai 2013 17:44:07
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 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];
    struct muchie
    {
        int nod;
        int cost;
    };
    vector<muchie> G[lim];
    int coada[lim];
    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 f,l,x,y;
        f=1;
        l=1;
        coada[1]=s;
        for(int i=1;i<=n;i++)
        {
            dist[i]=inf;
        }
        dist[s]=0;
        while(f<=l)
        {
            x=coada[f++];
            for(int i=0;i<G[x].size();i++)
            {
                if(dist[G[x][i].nod]>dist[x]+G[x][i].cost)
                {
                    coada[++l]=G[x][i].nod;
                    dist[G[x][i].nod]=dist[x]+G[x][i].cost;
                }
            }
        }
    }
    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;
                    break;
                    ok=false;
                }
            }
            if(ok==true)
            {
                out<<"DA"<<endl;
            }
        }
        else
        {
            out<<"NU"<<endl;
        }
    }
};
int main()
{
    distante X("distante.in","distante.out");
    X.solve();
    return 0;
}