Cod sursa(job #850868)

Utilizator elfusFlorin Chirica elfus Data 9 ianuarie 2013 00:56:13
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include <vector>
#define NMAX 50500
#define INF (1 << 30)
 
using namespace std;
 
int dist[NMAX], correct[NMAX];
vector <pair <int, int> > G[NMAX];
 
int main()
{
    int test, i, x, y, T, N, M, S, cost;
    vector <pair <int, int> > :: iterator it;
 
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);
 
    scanf("%d", &T);
    for (test = 1; test <= T; test ++)
    {
        scanf("%d%d%d", &N, &M, &S);
        for (i = 1; i <= N; i ++)
        {
            scanf("%d", &dist[i]);
            correct[i] = INF;
            G[i].clear();
        }
        for (i = 1; i <= M; i ++)
        {
            scanf("%d%d%d", &x, &y, &cost);
            G[x].push_back(make_pair(y, cost));
            G[y].push_back(make_pair(x, cost));
        }
        bool isCorrect = true;
 
        if (dist[S])
            isCorrect = false;
        correct[S] = 0;
 
        if (isCorrect)
            for (i = 1; i <= N; i ++)
                for (it = G[i].begin(); it != G[i].end(); it ++)
                    if (dist[i] + it -> second < correct[it -> first])
                        correct[it -> first] = dist[i] + it -> second;
 
        for (i = 1; i <= N; i ++)
            if (correct[i] != dist[i])
                isCorrect = false;
        if (isCorrect == true)
            printf("DA\n");
        else
            printf("NU\n");
    }
 
    return 0;
}