Cod sursa(job #874025)

Utilizator razvan.popaPopa Razvan razvan.popa Data 7 februarie 2013 20:35:26
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<iostream>
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<algorithm>
#define INF (1 << 30)
#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define ll long long
#define nxt (*it)
#define type int
#define FORi(i,a,b)\
   for(int i=a; i<=b; ++i)
#define FORir(i,a,b)\
   for(int i=a; i>=b; --i)
#define FORr(g)\
   for(vector<type>::reverse_iterator it=g.rbegin(); it!=g.rend(); ++it)
#define FOR(g)\
   for(vector<type>::iterator it=g.begin(); it!=g.end(); ++it)
#define infile "distante.in"
#define outfile "distante.out"
#define nMax 50005
using namespace std;

int Dist[nMax];

bitset < nMax > Good;

int N, M, S, T;

int main(){
    ifstream f(infile);
    ofstream g(outfile);

    int x, y, cost;
    for(f >> T; T; T--){
        f >> N >> M >> S;

        FORi(i,1,N)
           f >> Dist[i];

        if(Dist[S])
           goto NU;

        Good.reset();

        while(M--){
            f >> x >> y >> cost;
            if(Dist[x] + cost < Dist[y])
               goto NU;

            Good[x] = Good[x] | ((Dist[x] + cost) == Dist[y]);
            Good[y] = Good[y] | ((Dist[x] + cost) == Dist[y]);
        }

        FORi(i,1,N)
           if(!Good[i])
              goto NU;

        g << "DA\n";
        continue;

        NU:
        g << "NU\n";
    }


    f.close();
    g.close();

    return 0;
}