Cod sursa(job #787223)

Utilizator elfusFlorin Chirica elfus Data 12 septembrie 2012 21:20:50
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
//Sursa ciordita ca sa verific limita de timp

#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#include <cstring>

#define MAX 50005
#define INF 0x3f3f3f3f

using namespace std;

vector< pair < int , int > > v[MAX];
int dist[MAX], dmin[MAX], t, n, m, s, a, b, c;

int main()
{
    ifstream in("distante.in"); ofstream out("distante.out");
    in>>t;
    while(t--)
    {
        set< pair < int , int > > st;
        memset(dist, INF, sizeof(dist));
        in>>n>>m>>s; st.insert(make_pair(0, s)); dist[s] = 0;
        for(int i = 1; i <= n; i++)
        {
            in>>dmin[i];
            v[i].clear();
        }
        for(int i = 1; i <= m; i++)
        {
            in>>a>>b>>c;
            v[a].push_back(make_pair(b, c));
            v[b].push_back(make_pair(a, c));
        }
        while(!st.empty())
        {
            int val = (*st.begin()).first, nod = (*st.begin()).second;
            st.erase(st.begin());
            for(int i = 0; i < v[nod].size(); i++)
            {
                if(dist[v[nod][i].first] > v[nod][i].second + val)
                {
                    dist[v[nod][i].first] = v[nod][i].second + val;
                    st.insert(make_pair(dist[v[nod][i].first], v[nod][i].first));
                }
            }
        }
        int sw = 0;
        for(int i = 1; i <= n && !sw; i++)
            if(dmin[i] != dist[i]) sw = 1;
        if(!sw) out<<"DA\n";
        else out<<"NU\n";
    }
    return 0;
}