Cod sursa(job #1937352)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 23 martie 2017 21:44:45
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <vector>
#include <set>
#define nmax 50005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
set <pair <int,int> > p;
vector <pair <int,int > > v[nmax];
int n,m,s,e[nmax],d[nmax];


int solvetest()
{
    int i,j,a,b,c;
    f>>n>>m>>s;
    for (i=1;i<=n;i++) {
        v[i].clear();
        f>>e[i];
        d[i]=1<<30;
    }
    for (i=1;i<=m;i++) {
        f>>a>>b>>c;
        v[a].push_back(make_pair(b,c));
        v[b].push_back(make_pair(a,c));
    }
    d[s]=0;
    p.insert(make_pair(0,s));
    while (!p.empty()) {
        a=p.begin()->second;
        p.erase(p.begin());
        if (d[a]<e[a])
            return 0;
        for (i=0;i<v[a].size();i++) {
            b=v[a][i].first;
            c=v[a][i].second;
            if (d[b]>d[a]+c) {
                if (p.find(make_pair(d[b],b))!=p.end())
                    p.erase(p.find(make_pair(d[b],b)));
                d[b]=d[a]+c;
                p.insert(make_pair(d[b],b));
            }
        }
    }
    for (i=1;i<=n;i++)
        if (d[i]!=e[i])
            return 0;
    return 1;
}
int main()
{
    int t;
    for (f>>t;t;t--)
        (solvetest()==1)?g<<"DA\n":g<<"NU\n";

    return 0;
}