Cod sursa(job #1782402)

Utilizator MithrilBratu Andrei Mithril Data 18 octombrie 2016 08:39:46
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n,t,a,b,c,s,m;
struct Edge{
    int vecin;
    int cost;

    Edge(int vecin,int cost){
        this->vecin=vecin;
        this->cost=cost;
    }
};
struct Node{
    int node;
    int dist;

    Node(int node, int dist){
        this->node=node;
        this->dist=dist;
    }

    bool operator<(const Node &other) const {
        return this->dist>other.dist;
    }
};
priority_queue<Node> nextStep;

int main()
{
    fin>>t;
    for(int i=0;i<t;i+=1){

        fin>>n>>m>>s;
        vector<int> dist(n+1,INT_MAX);
        vector<int> check(n+1);
        list<Edge> adj[n+1];

        for(int i=1;i<=n;i+=1)fin>>check[i];

        for(int i=0;i<m;i+=1){
            fin>>a>>b>>c;
            adj[a].push_back(Edge(b,c));
            adj[b].push_back(Edge(a,c));
        }

        dist[s]=0;
        nextStep.push(Node(s,0));
        while(nextStep.size()){
            int x = nextStep.top().node;
            nextStep.pop();

            for(list<Edge>::iterator it=adj[x].begin();it!=adj[x].end();it++){
                if(dist[it->vecin]>dist[x]+it->cost){
                    dist[it->vecin]=dist[x]+it->cost;
                    nextStep.push(Node(it->vecin,dist[it->vecin]));
                }
            }
        }
        bool ok=true;
        for(int i=1;i<=n;i+=1)
            if(dist[i]!=check[i]){
                fout<<"NU"<<'\n';
                ok=false;
                break;
            }
        if(ok)fout<<"DA"<<'\n';
    }
    return 0;
}