Cod sursa(job #1898826)

Utilizator RazvanatorHilea Razvan Razvanator Data 2 martie 2017 12:02:41
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

vector < pair<int,int> > a[50005];
priority_queue < pair<int,int> > h;

int t,n,m,start;
int x,y,c;
int d[50005],cost[50005];
bool viz[50005],prel[50005];

bool ok()
{
    for (int i=1;i<=n;i++)
        if (d[i]!=cost[i]) return false;
    return true;
}


int main()
{
    fin>>t;
    for (int q=0;q<t;q++) {
        fin>>n>>m>>start;
        for (int i=1;i<=n;i++) fin>>cost[i];
        for (int i=0;i<m;i++) {
            fin>>x>>y>>c;
            a[x].push_back(make_pair(y,c));
            a[y].push_back(make_pair(x,c));
        }
        for (int i = 1; i <= n; i++) {
        d[i] = 1000000000;
        }
        d[start] = 0;
        h.push(make_pair(0,start));
        while (!h.empty()) {
            do {
                x=h.top().second;
                h.pop();
            }while (!h.empty() && prel[x]);
            prel[x]=true;
            for (int i=0;i<a[x].size();i++) {
                y=a[x][i].first;
                if (d[x]+a[x][i].second<d[y])
                    d[y]=d[x]+a[x][i].second;
                h.push(make_pair(-d[y],y));
            }
        }
        for (int i = 1; i <= n; i++) {
            if (d[i] == 1000000000) d[i]=0;
        }
        if (ok()) fout<<"DA\n";
        else fout<<"NU\n";
        for (int i=1;i<=n;i++) {
            a[i].clear();
            cost[i]=0;
        }
    }
}