Cod sursa(job #3158257)

Utilizator daria_pDaria Popescu daria_p Data 18 octombrie 2023 10:16:04
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <set>
#include <vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n,i,j,t,m,k,v[100005],x,y,c,d[50005];
const int INF=10000001;
set <pair<int,int>> q;
vector <pair<int,int>> l[50005];
void dijkstra(int nod, int cost)
{
    while (!q.empty())
    {
        nod=q.begin()->second;
        q.erase(q.begin());
        for (int i=0;i<l[nod].size();i++)
        {
            int vec = l[nod][i].first;
            int cost = l[nod][i].second;
            if (d[vec]>d[nod]+cost)
            {
                q.erase(make_pair(d[vec],vec));
                d[vec]=d[nod]+cost;
                q.insert(make_pair(d[vec],vec));
            }
        }
    }
}
int main()
{
    fin >>t;
    for (i=1;i<=t;i++)
    {
        fin >>n>>m>>k;
        for (j=1;j<=n;j++)
        {
            fin >>v[j];
            l[i].clear();
        }
        for (j=1;j<=m;j++)
        {
            fin >>x>>y>>c;
            l[x].push_back(make_pair(y,c));
            l[y].push_back(make_pair(x,c));
        }
        for (j=1;j<=n;j++)
        {
            d[j]=INF;
        }
        d[k]=0;
        q.insert(make_pair(0,k));
        dijkstra(0,k);
        int ok=0;
        for (j=1;j<=n;j++)
        {
            if (v[j]!=d[j]) {fout <<"NU"<<'\n'; ok=1;break;}
        }
        if (ok==0) fout <<"DA"<<'\n';
    }
    return 0;
}