Cod sursa(job #1146656)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 19 martie 2014 10:31:53
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<fstream>
#define maxn 50005
#define maxm 100002
#define inf 99999999
#include<set>
#include<vector>

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int T,n,m,nod,e1,e2,c,val,xx,ok;

set <pair <int,int> > S;

vector<int> d(maxn),dist(maxn);
void dijkstra(int r,int n,int &ok){
    ok=1;
    vector<int> G[maxn],C[maxn];
     for(int j=1;j<=m;++j){
                f>>e1>>e2>>c;
                G[e1].push_back(e2);
                G[e2].push_back(e1);
                C[e1].push_back(c);
                C[e2].push_back(c);

        }
    for(int i=1;i<=n;++i){
        d[i]=inf;
    }


    S.insert(make_pair(0,r));
    while(!S.empty() && ok==1){
             val=(*S.begin()).first;
             xx=(*S.begin()).second;
            S.erase(*S.begin());
        for(int i=0;i<G[xx].size();++i)
                if(d[G[xx][i]]>val+C[xx][i]){
                        d[G[xx][i]]=val+C[xx][i];
                        if(d[G[xx][i]]<dist[G[xx][i]]){
                            ok=0;
                            break;
                        }
                    S.insert(make_pair(d[G[xx][i]],G[xx][i]));
                }


    }
}

int main()
{
    f>>T;
    for(int i=1;i<=T;++i){
        f>>n>>m>>nod;
        for(int j=1;j<=n;++j)
            f>>dist[j];

      /*  for(int j=1;j<=m;++j){
                f>>e1>>e2>>c;
                G[e1].push_back(e2);
                G[e2].push_back(e1);
                C[e1].push_back(c);
                C[e2].push_back(c);

        }
        */
        dijkstra(nod,n,ok);

        if(ok==1)
            if(d[nod]==0)
                g<<"DA\n";
            else
                g<<"NU\n";
        else
            g<<"NU\n";

    }
    return 0;
}