Cod sursa(job #1461490)

Utilizator jul123Iulia Duta jul123 Data 15 iulie 2015 20:04:48
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<bits/stdc++.h>

#define INF 60000000

using namespace std;
set<pair<int, int> >q;
vector<pair<int, pair<int, int> > >v;
int ans[50005];
bool viz[50005];

int main()
{
    int t;

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

    fscanf(fin, "%d", &t);
    while(t--) {
        int n, m, s, a, b, c;
        q.clear();

        fscanf(fin, "%d %d %d", &n, &m, &s);
        --s;
        v.clear();

        for(int i = 0; i < n; ++i){
            fscanf(fin, "%d", &ans[i]);
            viz[i] = 0;
        }

        for(int i = 0; i < m; ++i) {
            fscanf(fin, "%d %d %d", &a, &b, &c);
            --a; --b;
            v.push_back(make_pair(c, make_pair(a, b)));
            v.push_back(make_pair(c, make_pair(b, a)));
        }
        bool ok = true;
        if(ans[s] != 0)
            ok = false;
        viz[s] = 1;
        for(int i = 0; i < v.size(); ++i) {
            c = v[i].first;
            a = v[i].second.first;
            b = v[i].second.second;
            if(ans[a] + c < ans[b])
                ok = false;
            if(ans[a] + c == ans[b])
                viz[b] = 1;
        }
        for(int i = 0; i < n; ++i)
            if(viz[i] == 0)
                ok = false;
        if(ok == true)
            fprintf(fout, "DA\n");
        else
            fprintf(fout, "NU\n");
    }
}