Cod sursa(job #1461482)

Utilizator jul123Iulia Duta jul123 Data 15 iulie 2015 19:54:38
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<bits/stdc++.h>

#define INF 60000000

using namespace std;
set<pair<int, int> >q;
vector<pair<int, int> >v[50005];
int d[50005], ans[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;

        for(int i = 0; i < n; ++i)
            v[i].clear();

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

        for(int i = 0; i < m; ++i) {
            fscanf(fin, "%d %d %d", &a, &b, &c);
            --a; --b;
            v[a].push_back(make_pair(b, c));
            v[b].push_back(make_pair(a, c));
        }
        q.insert(make_pair(0, s));
        for(int i = 0; i < n; ++i)
            d[i] = INF;
        d[s] = 0;
        while(!q.empty()) {
            int x = (*q.begin()).first;
            int j = (*q.begin()).second;
            q.erase(*q.begin());
           // cout<<j<<": ";
            for(int i = 0; i < v[j].size(); ++i) {
                //cout << v[j][i].first << " ";
                if(x + v[j][i].second < d[v[j][i].first]) {
                    d[v[j][i].first] = x + v[j][i].second ;
                    q.insert(make_pair(d[v[j][i].first], v[j][i].first));
                }
            }
        }
        bool ok = true;
        for(int i = 0; i < n; ++i) {
           // cout << ans[i] << " "<<d[i] << "\n";
            if(ans[i] != d[i])
                ok = false;
        }

        if(ok == true) {
            fprintf(fout, "DA\n");
        } else
            fprintf(fout, "NU\n");

    }
}