Cod sursa(job #2302457)

Utilizator Andrei.GheorgheAndrei Gheorghe Andrei.Gheorghe Data 14 decembrie 2018 17:48:26
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
queue < int > coada;
const int NMax=50005;
const int inf=9999999;
vector < pair <int,int> > graf[NMax];
    bool verif[NMax];
    long dist[NMax];
void ford(int ns, int n, int m)
{
    long elem;
    for(int i=1;i<=n+3;i++) dist[i]=inf;
    dist[ns]=0;
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        cin>>x>>y>>c;
        graf[x].push_back(make_pair(y,c));
    }
    coada.push(ns);
    while(!coada.empty())
    {
        elem=coada.front();
                coada.pop();
                verif[elem]=0;
        for(int i=0;i<graf[elem].size();i++)
        {
            if(graf[elem][i].second+dist[elem]<dist[graf[elem][i].first])
            {
                dist[graf[elem][i].first]=dist[elem]+graf[elem][i].second;
                          if(verif[graf[elem][i].first]==0)
            {
            coada.push(graf[elem][i].first);
            verif[graf[elem][i].first]=1;
            }
            }
        }
    }
}
int main()
{
    int ns,pic;
    cin>>pic;
    for(int o=1;o<=pic;o++)
    {
        int ver[9000];
        bool daca=0;
        int n,m,ns;
        cin>>n>>m>>ns;
        for(int y=1;y<=n;y++)
        {
            cin>>ver[y];
        }
        ford(ns,n,m);
        for(int i=0;i<=NMax;i++)
        {
            verif[i]=0;
        }
                for(int y=1;y<=n;y++)
        {
            if(ver[y]!=dist[y])daca=1;
        }
        if(daca==1)cout<<"NU"<<endl;else cout<<"DA"<<endl;
        for(int o=0;o<=n+2;o++)graf[o].clear();
    }
}