Cod sursa(job #2306292)

Utilizator SahMatCodrea Andrei SahMat Data 21 decembrie 2018 21:44:21
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 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++)
            {   //vv[nmin].erase(vv[nmin].end()-1);
                v=vv[nmin][j];
                //fo<<nmin<<" "<<v<<" ";
                if(!sel[v])
                {
                    dn=d[nmin]+cost[nmin][j];
                    //fo<<cost[nmin][j]<<endl;
                    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++)
       {
           //fo<<d[i+1]<<" ";
           if(d[i+1]!=dd[i])
            corect=0;
       }//fo<<endl;
        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;

            if(y==s)
               {
                 vv[y].push_back(x);
                 cost[y].push_back(c);
               }
            else
            {
                vv[x].push_back(y);
                cost[x].push_back(c);
            }
        }

        dijkstra(s);
        for(int j=1;j<=n;j++)
        {
            vv[j].clear();
            cost[j].clear();
            sel[j]=false;
        }
        dd.clear();
        /*for(int i=1;i<=n;i++)
        {for(int j=0;j<vv[i].size();j++)
            fo<<vv[i][j]<<" ";
            fo<<endl;
        }*/
    }


    return 0;
}