Cod sursa(job #1043300)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 28 noiembrie 2013 12:42:58
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

int N,sol[50005],start,dist[50005],viz[50005];

struct muchie
{
    int nod,cost;
};
vector <muchie> L[50005];
queue <int> Q;

inline void Read()
{
    int i,x,y,cost,M;
    muchie w;
    fin>>N>>M>>start;
    for(i=1;i<=N;i++)
        L[i].clear();
    for(i=1;i<=N;i++)
    {
        fin>>sol[i];
        dist[i]=viz[i]=0;
    }
    for(i=1;i<=M;i++)
    {
        fin>>x>>y>>cost;
        w.nod=x; w.cost=cost;
        L[y].push_back(w);
        w.nod=y; w.cost=cost;
        L[x].push_back(w);
    }
}

inline void Bfs()
{
    int i,nod,j,len,cost;
    viz[start]=1; Q.push(start);
    while(!Q.empty())
    {
        nod=Q.front(); Q.pop();
        len=L[nod].size();
        for(i=0;i<len;i++)
        {
            j=L[nod][i].nod; cost=L[nod][i].cost;
            if(!viz[j] || dist[j]>dist[nod]+cost)
            {
                dist[j]=dist[nod]+cost;
                viz[j]=1; Q.push(j);
            }
        }
    }
}

inline void Write()
{
    int i,ok=1;
    for(i=1;i<=N;i++)
        if(sol[i]!=dist[i])
            ok=0;
    if(ok)
        fout<<"DA\n";
    else
        fout<<"NU\n";
}

int main()
{
    int T;
    fin>>T;
    while(T--)
    {
        Read();
        Bfs();
        Write();
    }
    fin.close();
    fout.close();
    return 0;
}