Cod sursa(job #1563679)

Utilizator mirupetPetcan Miruna mirupet Data 6 ianuarie 2016 14:16:31
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#define INF 0x3f3f3f3f
#define DIM 50003
using namespace std;

FILE *fin = freopen("distante.in","r",stdin);
FILE *fout = freopen("distante.out","w",stdout);

int T, N, M, S;
int u[DIM];
vector < pair <int, int> > v[DIM];
set < pair <int, int> > SET;

void dijkstra(int);

int main()
    {
        int X, Y, Z;

        for (scanf("%d", &T); T; T--)
        {
            scanf("%d%d%d", &N, &M, &S);

            for (int i = 1; i <= N; i++)
                scanf("%d", &u[i]);

            for (int i = 1; i <= M; i++)
            {
                scanf("%d%d%d", &X, &Y, &Z);
                v[X].push_back(make_pair(Y,Z));
                v[Y].push_back(make_pair(X, Z));
            }

            dijkstra(S);
        }
    }

void dijkstra(int x)
{
    int w[DIM];

    memset(w, INF, sizeof(w));

    w[x] = 0;
    SET.insert(make_pair(0, x));

    while (SET.size())
    {
        int nod = (*SET.begin()).second;

        SET.erase(*SET.begin());

        for (int i = 0; i < v[nod].size(); i++)
            if (w[v[nod][i].first] > v[nod][i].second + w[nod])
            {
                w[v[nod][i].first] = v[nod][i].second + w[nod];
                SET.insert(make_pair(w[v[nod][i].first], v[nod][i].first));
            }
    }

    for (int i = 1; i <= N; i++)
    {
        if (w[i] == INF)
            w[i] == 0;

        if (w[i] != u[i])
        {
            printf("NU\n");
            return;
        }
    }

    printf("DA\n");
}