Cod sursa(job #593732)

Utilizator rootsroots1 roots Data 4 iunie 2011 12:50:04
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <algorithm>
#include <fstream>
#include <cstring>
#include <vector>

#define MAX 50001

using namespace std;

vector <pair<int,int> > v[MAX];
int D[MAX],ok[MAX];

int main()
{
    int T,M,N,S,x,y,c,end;
    vector <pair<int,int> >::iterator it;

    ifstream in;
    ofstream out;

    in.open("distante.in");
    out.open("distante.out");

    in>>T;
    for(;T;T--)
    {
        memset(D,0,sizeof(D));
        in>>N>>M>>S;

        for(int i=1;i<=N;i++) in>>D[i];

        for(;M;--M)
        {
            in>>x>>y>>c;
            v[x].push_back(make_pair(y,c));
            v[y].push_back(make_pair(x,c));
        }

        if(D[S]!=0) out<<"NU\n";
        else
        {
            memset(ok,0,sizeof(ok));
            ok[S]=1;
            end=0;

            for(int i=1;i<=N;i++)
            {
                for(it=v[i].begin();it!=v[i].end();it++)
                    if(D[i]+(*it).second<D[(*it).first])
                    {
                        end=1;
                        break;
                    }
                    else
                    if(D[i]+(*it).second==D[(*it).first]) ok[(*it).first]=1;
                if(end) break;
            }

            if(!end)
                for(int i=1;i<=N;i++)
                    if(!ok[i])
                    {
                        end=1;
                        break;
                    }

            if(!end) out<<"DA\n";
            else out<<"NU\n";
        }

        for(;N;N--)
            v[N].clear();
    }

    in.close();
    out.close();

    return 0;
}