Cod sursa(job #2304966)

Utilizator CRiSTi107Voiculescu Cristian CRiSTi107 Data 18 decembrie 2018 21:34:03
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 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(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 <= m; i++)
            for(j = 1; j <= m; j++)
                if(i != j)
                    c[i][j] = INF;

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

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

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

    for(i = 1; i <= n; i++)
    {
        _d[i] = 0;
        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;
}