Cod sursa(job #1875613)

Utilizator danyvsDan Castan danyvs Data 11 februarie 2017 13:08:59
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

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

const int NMAX = 50005;
const int INF = 500000005;

int queries, n, m, src;
vector < vector < pair < int, int > > > G(NMAX);
int D[NMAX], dist[NMAX];

void init()
{
    for (int i = 1; i <= n; ++ i)
        G[i].erase(G[i].begin(), G[i].end());
    memset(dist, 0, sizeof(dist));
}

void read()
{
    fin >> n >> m >> src;
    for (int i = 1; i <= n; ++ i)
        fin >> D[i];
    for (int i = 0; i < m; ++ i)
        {
         int x, y, z;
         fin >> x >> y >> z;
         G[x].push_back(make_pair(z, y));
         G[y].push_back(make_pair(z, x));
        }
}

void dijkstra()
{
    priority_queue < pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > > PQ;
    for (int i = 1; i <= n; ++ i)
        dist[i] = INF;
    dist[src] = 0;
    PQ.push(make_pair(0, src));
    while (!PQ.empty())
        {
         int d = PQ.top().first;
         int par = PQ.top().second;
         PQ.pop();
         if (d <= dist[par])
            for (vector < pair < int, int > > :: iterator it = G[par].begin(); it != G[par].end(); ++ it)
                {
                 int c = (*it).first;
                 int father = (*it).second;
                 if (dist[father] > d + c)
                    {
                     dist[father] = d + c;
                     PQ.push(make_pair(dist[father], father));
                    }
                }
        }
}

bool check()
{
    for (int i = 1; i <= n; ++ i)
        if (D[i] != dist[i])
            return false;
    return true;
}

int main()
{
    fin >> queries;
    for (int i = 1; i <= queries; ++ i)
        {
         init();
         read();
         dijkstra();
         fout << (check() ? "DA\n" : "NU\n");
        }
    fin.close();
    fout.close();
    return 0;
}