Cod sursa(job #880260)

Utilizator PatrikStepan Patrik Patrik Data 16 februarie 2013 15:52:09
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
    #include<cstdio>
    #include<fstream>
    #include<vector>
    #include<set>

    #define pb push_back
    #define MAX 50001
    #define INF 50000002
    using namespace std;
    int t , n , m , s  , d[MAX] , sol[MAX];
    vector<int> C[MAX];
    vector<int> G[MAX];
    vector<int>::iterator it , it1;
    bool sw;
    struct Compar{
    bool operator()(int i , int j)
    {
        return d[i] < d[j];
    }
    };
    multiset<int,Compar> Q;

    void dijkstra(int nod);

    int main()
    {
        int x , y , cost;
        ifstream f("distante.in");
        ofstream g("distante.out");
        f>>t;
        for( int i = 1 ; i <= t ; ++i )
        {
            f>>n>>m>>s;
            for( int i = 1 ; i<= n ; ++i )
                f>>sol[i];
            for( int j = 1 ; j<= m ; ++j )
                {
                    f>>x>>y>>cost;
                    C[x].pb(cost);
                    C[y].pb(cost);
                    G[x].pb(y);
                    G[y].pb(x);
                }
            dijkstra(s);
            sw = 1;
            for( int i = 1 ; i<= n && sw; ++i )
                if(d[i] != sol[i])sw = 0;
            if(sw)g<<"DA"<<"\n";
            else g<<"NU"<<"\n";

        }
        f.close();
        g.close();
        return 0;
    }

    void dijkstra( int nod)
    {
        int k;
        for( int i = 1 ; i<= n ; ++i )d[i] = INF;
        d[s] = 0;
        Q.insert(s);
        while(!Q.empty())
        {
            k = *Q.begin();
            Q.erase(Q.begin());
            for(it = G[k].begin() , it1 = C[k].begin() ; it < G[k].end() ; it++ , it1++ )
                if(d[*it] > d[k] + *it1)
                {
                    d[*it] = d[k] + *it1;
                    Q.insert(*it);
                }
        }
    }