Cod sursa(job #2709088)

Utilizator enedumitruene dumitru enedumitru Data 19 februarie 2021 18:29:48
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <bits/stdc++.h>
#define INF 1000000000
#define x first
#define y second
using namespace std;
ifstream f("distante.in"); ofstream g("distante.out");
vector <pair<int,int> >L[50010];
///set <pair<int,int> >s;
priority_queue <pair<int,int> > q;
int D[50010],verifD[50010];
int main()
{   int T;
    f>>T;
    for(int n,m,st;T;T--)
    {   f>>n>>m>>st;
        for(int i=1;i<=n;i++) f>>verifD[i];
        for(int x,y,c,i=1;i<=m;i++)
        {   f>>x>>y>>c;
            L[x].push_back(make_pair(y,c));
            L[y].push_back(make_pair(x,c));
        }
        for(int i=1;i<=n;i++) D[i]=INF;
        D[st]=0;
        ///s.insert(make_pair(0,st));
        q.push(make_pair(0,st));
        while(!q.empty())
        {   ///int k=s.begin()->second;
            ///s.erase(s.begin());
            pair <int,int> P=q.top(); q.pop();
            int cost=-P.x,nod=P.y;
            vector <pair<int,int> > :: iterator it=L[nod].begin(),sf=L[nod].end();
            for(;it!=sf;++it)
            {   if(D[(*it).x]>cost+(*it).y)
                {   D[(*it).x]=cost+(*it).y;
                    q.push(make_pair(-D[(*it).x],(*it).x));
                }
               /// if(D[L[k][i].first]>D[k]+L[k][i].second)
               /// {   s.erase(make_pair(D[L[k][i].first],L[k][i].first));
               ///     D[L[k][i].first]=D[k]+L[k][i].second;
               ///     s.insert(make_pair(D[L[k][i].first],L[k][i].first));
               /// }
            }
        }
        int ok=1;
        for(int i=1;i<=n;i++)
        {   if(D[i]!=verifD[i]) ok=0;
            L[i].clear();
        }
        if (ok==0) g<<"NU\n"; else g<<"DA\n";
    }
    g.close(); f.close(); return 0;
}
/*
#include <bits/stdc++.h>
#define inf 1000000000
#define x first
#define y second
using namespace std;
ifstream f("dijkstra2.in"); ofstream g("dijkstra2.out");
const int Nmax=100010;
priority_queue <pair<int,int> > q;
int d[Nmax],viz[Nmax];
vector <pair<int,int> > L[Nmax];
int main()
{   int n,m,s;
    f>>n>>m>>s;
    for(int a,b,c,i=1;i<=m;++i)
    {   f>>a>>b>>c;
        L[a].push_back(make_pair(b,c));
        L[b].push_back(make_pair(a,c));
    }
    for(int i=1;i<=n;i++) d[i]=inf;
 	d[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty())
    {   pair <int,int> P=q.top(); q.pop();
        int cost=-P.x,nod=P.y;
        if(!viz[nod])
        {   viz[nod]=1;
            vector <pair<int,int> > :: iterator it=L[nod].begin(),sf=L[nod].end();
            for(;it!=sf;++it)
                if(d[(*it).x]>cost+(*it).y)
                {   d[(*it).x]=cost+(*it).y;
                    q.push(make_pair(-d[(*it).x],(*it).x));
                }
        }
    }
    for(int i=1;i<=n;i++)
        if(d[i]==inf) g<<"-1 "; else g<<d[i]<<' ';
    g.close(); f.close(); return 0;
}

*/