Cod sursa(job #1701207)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 12 mai 2016 14:21:13
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <climits>
#define MAX1  50001
#define MAX2 100001

using namespace std;


unsigned short int T;
unsigned short int N, S;
unsigned int M;
unsigned int D[MAX1];

unsigned int path[MAX2];
unsigned int i, j;
bool okay;


struct muchie
{
    int a, b, c;
};

muchie v[MAX2];

int main()
{
    ifstream fin ("distante.in");
    ofstream fout ("distante.out");
    fin >> T;
    while (T)
    {
        fin >> N >> M >> S;
        for (i=1; i<=N; i++)
        {
            fin >> D[i];
            path[i] = 0;
        }
        for (i=1; i<=M; i++)
        {
            fin >> v[i].a >> v[i].b >> v[i].c;
            if (v[i].a == S)
                path[v[i].b] = v[i].c;
            else if (v[i].b == S)
                path[v[i].a] = v[i].c;
        }
        for (i=1; i<=N; i++)
            if (i != S && path[i] == 0)
                path[i] = INT_MAX;
        okay = 0;
        while (okay == 0)
        {
            okay = 1;
            for (i=1; i<=M; i++)
            {
                if (path[v[i].a] + v[i].c < path[v[i].b])
                {
                    path[v[i].b] = path[v[i].a] + v[i].c;
                    okay = 0;
                }
                if (path[v[i].b] + v[i].c < path[v[i].a])
                {
                    path[v[i].a] = path[v[i].b] + v[i].c;
                    okay = 0;
                }
            }
        }
        okay = 1;
        for (i=1; i<=N && okay; i++)
            if (path[i] != D[i])
                okay = 0;
        if (okay)
            fout << "DA\n";
        else
            fout << "NU\n";
        T--;
    }
    fin.close();
    fout.close();
    return 0;
}