Cod sursa(job #2306264)

Utilizator SahMatCodrea Andrei SahMat Data 21 decembrie 2018 20:59:06
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <vector>
#include <queue>

#define NMAX 50001
#define INF 10000000

using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");

struct NOD{
unsigned short int n;
unsigned int d;
};

struct cmp{
bool operator()(const NOD&a, const NOD&b)const{
    return(a.d>b.d);
}
};

int t,n,m,s,d[NMAX];
int x,y,c,z;
vector<int> vv[NMAX], cost[NMAX], dd;
priority_queue<NOD ,vector<NOD>, cmp> pq;
bool sel[NMAX];

void dijkstra(int s)
{
    NOD nod;
    int nmin,v,dn;

    for(int i=1;i<=n;i++)
        d[i]=INF;

    d[s]=0;
    nod.n=s;
    nod.d=0;pq.push(nod);

    while(!pq.empty())
    {
        nod=pq.top();pq.pop();
        nmin=nod.n;

        if(!sel[nmin])
        {
            for(int j=0;j<vv[nmin].size();j++)
            {
                v=vv[nmin][j];
                if(!sel[v])
                {
                    dn=d[nmin]+cost[nmin][j];
                    if(dn<d[v])
                    {
                        d[v]=dn;
                        nod.n=v;
                        nod.d=dn;
                        pq.push(nod);
                    }
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
        if(d[i]==INF)
        d[i]=0;

    int corect=1;
    for(int i=0;i<n;i++)
        if(d[i+1]!=dd[i])
            corect=0;

        if(corect)
            fo<<"DA"<<'\n';
        else
            fo<<"NU"<<'\n';

}

int main()
{
    fi>>t;
    for(int i=1;i<=t;i++)
    {
        fi>>n>>m>>s;
        for(int j=1;j<=n;j++)
        {
            fi>>z;
            dd.push_back(z);
        }
        for(int j=1;j<=m;j++)
        {
            fi>>x>>y>>c;
            vv[x].push_back(y);
            cost[x].push_back(c);
        }
        dijkstra(s);
        for(int j=1;j<=n;j++)
        {
            vv[i].clear();
            cost[i].clear();
            sel[i]=false;
        }
        dd.clear();

    }


    return 0;
}