Cod sursa(job #1479600)

Utilizator dnprxDan Pracsiu dnprx Data 31 august 2015 17:56:30
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>
#define infinit 1000000000
using namespace std;

vector< pair<int,int> > h[50001];
int n, m, S;
int d[50001], c[50001], viz[50001];

/// returneaza 1 daca distantele minime sunt bune, sau 0 altfel
int Dijkstra()
{
    int i, j, k, cost;
    queue <int> q;
    /// initializari
    for (i = 1; i <= n; ++i)
    {
        c[i] = infinit;
        viz[i] = 0;
    }
    c[S] = 0;
    viz[S] = 1;
    if (c[S] != d[S]) return 0;
    q.push(S);
    while (!q.empty())
    {
        k = q.front();
        q.pop();
        for (i = 0; i < h[k].size(); i++)
        {
            j = h[k][i].first;
            cost = h[k][i].second;
            if (!viz[j] && c[j] > c[k] + cost)
            {
                c[j] = c[k] + cost;
                if (c[j] < d[j]) return 0;
                if (c[j] == d[j])
                {
                    viz[j] = 1;
                    q.push(j);
                }
            }
        }
    }
    for (i = 1; i <= n; ++i)
        if (c[i] != d[i]) return 0;
    return 1;
}

void GolesteH()
{
    int i;
    for (i = 1; i <= n; ++i)
        while (!h[i].empty())
            h[i].pop_back();
}

void CitireAfisare()
{
    int i, T, pas, x, y, cost, rez;
    ifstream fin("distante.in");
    ofstream fout("distante.out");
    fin >> T;
    for (pas = 1; pas <= T; ++pas)
    {
        fin >> n >> m >> S;
        GolesteH();
        for (i = 1; i <= n; ++i)
            fin >> d[i];
        for (i = 1; i <= m; ++i)
        {
            fin >> x >> y>> cost;
            h[x].push_back(make_pair(y, cost));
            h[y].push_back(make_pair(x, cost));
        }
        rez = Dijkstra();
        if (rez == 1) fout << "DA\n";
        else fout << "NU\n";
    }
    fin.close();
    fout.close();
}

int main()
{
    CitireAfisare();
    return 0;
}