Cod sursa(job #2135845)

Utilizator andreeagoideaAndreea Goidea andreeagoidea Data 19 februarie 2018 12:38:50
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

vector < pair <int, int> > v[50001];

priority_queue < pair <int, int> > heap;

int dist[50001], sol[50001];

int n, m, t, ok, x0, x, y, z;

void dijkstra(int node)
{
    int nod, c, fiu, cost;
    heap.push( {0, node} );
    while(heap.size())
    {
        nod=heap.top().second;
        c=-heap.top().first;
        heap.pop();
        if(c<=dist[nod])
        {
            for(int k=0; k<v[nod].size(); k++)
            {
                fiu=v[nod][k].first;
                cost=v[nod][k].second;
                if(cost+dist[nod]<dist[fiu])
                {
                    dist[fiu]=cost+dist[nod];
                    heap.push( {-dist[fiu], fiu} );
                }
            }
        }
    }
}

int main()
{
    fin>>t;
    for(int i=1; i<=t; i++)
    {
        fin>>n>>m>>x0;
        ok=1;
        for(int j=1; j<=n; j++)
            fin>>sol[j];
        for(int j=1; j<=m; j++)
        {
            fin>>x>>y>>z;
            v[x].push_back( {y, z} );
            v[y].push_back( {x, z} );
        }
        for(int j=1; j<=n; j++)
            dist[j]=50000001;
        dist[x0]=0;
        dijkstra(x0);
        for(int j=1; j<=n && ok; j++)
            if(dist[j]!=sol[j])
                ok--;
        if(ok==0)
            fout<<"NU\n";
        else
            fout<<"DA\n";
        for(int j=1; j<=n; j++)
            v[j].clear();

    }
    return 0;
}