Cod sursa(job #1515589)

Utilizator DobosDobos Paul Dobos Data 1 noiembrie 2015 21:23:20
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;
const int MAX = 50005;
const int BMOD = 50;
const int INF = 1e9;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int v[MAX],D[MAX],e = BMOD - 1,n;
char buffer[BMOD+1];
vector < pair < int , int > > G[MAX];
set < pair < int , int > > T;
inline void parsare(int &x){
while(!isdigit(buffer[e])){
    e++;
    if(e == BMOD)
        e = 0,fin.read(buffer,BMOD);
    }
    x = 0;
    while(isdigit(buffer[e])){
        x = x * 10 + (buffer[e] - '0');
        e++;
        if(e == BMOD)
            e = 0,fin.read(buffer,BMOD);
    }
}
inline void distanta()
{
    int cost,nod;
    for(int i = 1; i <= n ; i++)
        D[i] = INF;
    D[(*T.begin()).second] = 0;
    while(!T.empty()){
        cost = (*T.begin()).first;
        nod = (*T.begin()).second;
        T.erase(*T.begin());
        for(int i = 0 ; i < G[nod].size();i++)
            if(D[G[nod][i].second] > D[nod] + G[nod][i].first){
               D[G[nod][i].second] =  D[nod] + G[nod][i].first;
               T.insert({D[G[nod][i].second],G[nod][i].second});
            }
    }
    for(int i = 1; i <= n; i++)
        G[i].clear();
}
int main()
{
    int s,p,x,y,c,ok,m;
    parsare(p);
    for(int i = 1; i <= p; i++){
        parsare(n); parsare(m); parsare(s);
        for(int j = 1; j <= n; j++)
            parsare(v[j]);
        for(int j = 1; j <= m; j++){
        parsare(x); parsare(y); parsare(c);
        G[x].push_back({c,y});
        G[y].push_back({c,x});
        }
        T.insert({0,s});
        distanta();
        ok = 1;
        for(int j = 1; j <= n ; j++)
            if(D[j] != v[j])
            ok = 0,j = n +1;
        if(ok == 1)
            fout << "DA" << "\n";
        else
            fout << "NU" << "\n";
    }
    return 0;
}