Cod sursa(job #2039935)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 15 octombrie 2017 09:50:45
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <deque>
#define INF 2000000000

using namespace std;
int drez[50001],sol[50001],f[50001];
deque <int> nod;
vector <pair <int,int> > v[50001];
int main()
{
    FILE *fin=fopen ("distante.in","r");
    FILE *fout=fopen ("distante.out","w");
    int n,m,i,vecin,x,y,z,p,cost,t,nc;
    fscanf (fin,"%d",&t);
    for (;t;t--){
        fscanf (fin,"%d%d%d",&n,&m,&p);
        for (i=1;i<=n;i++){
            fscanf (fin,"%d",&drez[i]);
            sol[i]=INF;
            v[i].clear();
        }
        for (i=1;i<=m;i++){
            fscanf (fin,"%d%d%d",&x,&y,&z);
            v[x].push_back(make_pair (y,z));
            v[y].push_back(make_pair (x,z));
        }
        f[p]=1;
        nod.push_back(p);
        sol[p]=0;
        while (nod.size()!=0){
            nc=*nod.begin();
            f[nc]=0;
            nod.pop_front();
            for (vector <pair <int,int> > :: iterator it=v[nc].begin(); it != v[nc].end(); it++){
                vecin=it->first;
                cost=it->second;
                if (sol[nc]+cost<sol[vecin]){
                    sol[vecin]=sol[nc]+cost;
                    if (f[vecin]==0){
                        f[vecin]=1;
                        nod.push_back(vecin);
                    }
                }
            }
        }
        for (i=1;i<=n;i++)
            if (sol[i]!=drez[i])
                break;
        if (i<=n)
            fprintf (fout,"NU\n");
        else fprintf (fout,"DA\n");
    }
    return 0;
}