Cod sursa(job #3184238)

Utilizator bxgdanelLuca Bogdan bxgdanel Data 15 decembrie 2023 09:33:00
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#include <fstream>


using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
/*void dr(int n,int a[][100],int k,int d[]){
    int ant[100]={0},viz[100]={0};
    ant[k]=0;
    for(int i=1;i<=n;i++)
        if(a[k][i])
        d[i]=a[k][i],ant[i]=k;
        else d[i]=ant[i]=-1;
    viz[k]=1;
    d[k]=0;
    bool ok= true;
    while(ok){
        int vc=-1;
        for(int i=1;i<=n;i++)
            if(!viz[i] && d[i]==-1)
                if(d[i]<d[vc] || vc==-1)
                    vc=i;
        if(vc!=-1)
        {
            for(int i=1;i<=n;i++)
                if(a[vc][i])
                if(d[i]>d[vc]+a[vc][i] || d[i]==-1)
                d[i]=d[vc]+a[vc][i],ant[i]=vc;
            viz[vc]=1;
        }
        else ok = false;
    }
}
*/
int a[50001][50001],d[50001];
void dj(int n,int v){
  int ant[101], mc[101]= {0}; ///vector de marcaje
    for(int i=1; i<=n; ++i)
        if(a[v][i]!=0)
        {
            d[i]=a[v][i];
            ant[i]=v;
        }
        else
            d[i]=ant[i]=-1;
    d[v]=0;
    ant[v]=0;
    mc[v]=1;
    bool ok=true;
    while(ok)
    {
        int vc=-1,dmin=-1;
        for(int i=1; i<=n; ++i)
            if(!mc[i] && d[i]!=-1)
                if(vc==-1 || d[i]<dmin)
                    vc=i,dmin=d[vc];
        if(vc!=-1)
        {
            for(int i=1; i<=n; ++i)
                if(a[vc][i]!=0)
                    if(d[i]>d[vc]+a[vc][i] || d[i]==-1)
                        d[i]=d[vc]+a[vc][i], ant[i]=vc;
            mc[vc]=1;
        }
        else
            ok=false;
    }
}
int main()
{
    int T,n,m,s,br[100];
    fin>>T;
   for(int q=0;q<T;q++)
    {
        fin>>n>>m>>s;
        for(int y=1;y<=n;y++)
            fin>>br[y];
        for(int i=1;i<=m;i++)
        {
            int x,y;
            fin>>x>>y;
            fin>>a[x][y];
        }
        dj(n,s);
        bool da=true;
        for(int i=1;i<=n;i++)
            if(br[i]!=d[i])
                da=false;
        if(da)
            fout<<"DA"<<endl;
        else
            fout<<"NU"<<endl;
    }

}

  /*  fin>>n>>m;
    for(int i=1;i<=m;i++)
        {
            int x,y;
            fin>>x>>y;
            int c;
            fin>>c;
            a[x][y]=c,a[y][x]=c;
        }
    dj(n,a,1,d);
    for(int i=1;i<=n;i++)
        fout<<d[i]<<' ';

    return 0;
}
/*
5 5
1 2 1
1 3 4
2 3 2
3 4 4
4 5 2
*/