Cod sursa(job #1145844)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 18 martie 2014 14:42:41
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#define maxn 50001
#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;
vector<int> G[maxn],C[maxn];
set <pair <int,int> > S;
int d[maxn],dist[maxn];

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

    S.insert(make_pair(0,r));
    while(!S.empty()){
            int val=(*S.begin()).first;
            int 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];
                    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);
        int ok=0;
        d[nod]=0;
        for(int j=1;j<=n;++j){

            if(d[j]!=dist[j]){
                        g<<"NU\n";
                        ok=1;
                        break;
                    }
        G[j].clear();
        C[j].clear();

        }

        if(ok==0)
            g<<"DA\n";

    }
    return 0;
}