Cod sursa(job #2305014)

Utilizator CRiSTi107Voiculescu Cristian CRiSTi107 Data 18 decembrie 2018 22:45:18
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>

using namespace std;

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

int t, m, n, s, d[50500], c[10000][10000];

#define INF 9999999

bool dijkstra_check(int r);

void cit()
{
    fin >> t;

    int i, j, k, cost, a, b;

    for(k = 1; k <= t; k++)
    {
        fin >> n >> m >> s;

        for(i = 1; i <= n; i++)
            fin >> d[i];

        //clear Cost matrix
        for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
                if(i != j)
                    c[i][j] = INF;
                else
                    c[i][j] = 0;

        for(i = 1; i <= m; i++)
        {
            fin >> a >> b >> cost;
            c[a][b] = c[b][a] = cost;
        }

        if(dijkstra_check(s))
            fout << "DA" << endl;
        else
            fout << "NU" << endl;
    }
}

bool dijkstra_check(int r)
{
    int i, j, k, Min,
        _d[50500], t[50500], _s[50500];

    for(i = 1; i <= n; i++)
    {
        _d[i] = INF;
        t[i] = 0;
    }

    for(i = 1; i <= n; i++)
    {
        _d[i] = c[r][i];
        t[i] = r;
        t[r] = 0;
        _s[r] = 1; // i
        for(k = 1; k < n; k++)
        {
            Min = INF;
            for(j = 1; j <= n; j++)
                if(_s[j] == 0 && _d[j] < Min)
                {
                    Min = _d[j];
                    i = j;
                }
            _s[i] = 1;
            for(j = 1; j <= n; j++)
                if(_d[j] > _d[i] + c[i][j])
                {
                    _d[j] = _d[i] + c[i][j];
                    t[j] = i;
                }
        }
    }


    for(i = 1; i <= n; i++)
        if(_d[i] != d[i])
            return false;

    return true;
}

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