Cod sursa(job #1847753)

Utilizator GeoeyMexicanuBadita George GeoeyMexicanu Data 14 ianuarie 2017 23:46:02
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define N 50010
#define INF 20000001

using namespace std;

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

vector<pair<int,int>> vec[N];
bool Queue[N];
int dist[N],valin[N],i,j,n,m,k,t,p,r;

int main()
{
    int from,to,cost,ok;
    f>>t;
    while(t!=0)
    {
        ok=1;
        f>>n>>m>>k;
        for(i=1;i<=n;i++)
            f>>valin[i];
        for(i=1;i<=n;i++)
        {
            Queue[i]=false;
            vec[i].clear();
        }
        while(m!=0)
        {
            f>>from>>to>>cost;
            vec[from].push_back(make_pair(to,cost));
            m--;
        }
        for(i=1;i<=n;i++)
            dist[i]=INF;
        dist[k]=0;
        queue<int> q;
        q.push(k);
        int nod;
        while(!q.empty())
        {
            nod=q.front();
            Queue[nod]=false;
            q.pop();
            for(vector<pair<int,int>>::iterator it=vec[nod].begin();it!=vec[nod].end();++it)
            {
                int to=it->first;
                int cost=it->second;
                if(dist[to]>dist[nod]+cost)
                {
                    dist[to]=dist[nod]+cost;
                    if(Queue[to]!=true)
                    {
                        Queue[to]=true;
                        q.push(to);
                    }
                }
            }
        }
        for(i=1;i<=n;i++)
        {
            if(valin[i]!=0 || dist[i]!=INF){
            if(valin[i]!=dist[i])
            ok=0;
            }
        }
        if(ok==1)
            g<<"DA"<<"\n";
        else
            g<<"NU"<<"\n";
        t--;
    }
}