Cod sursa(job #1782410)

Utilizator MithrilBratu Andrei Mithril Data 18 octombrie 2016 08:54:32
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 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<bool> vis(n+1,false);
        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));
        }

        bool ok=true;
        dist[s]=0;
        nextStep.push(Node(s,0));
        while(nextStep.size()){
            int x = nextStep.top().node;
            nextStep.pop();
            if(!vis[x]){
                if(dist[x]!=check[x]){
                    ok=false;
                    fout<<"NU"<<'\n';
                    break;
                }
                vis[x]=true;

                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]));
                    }
                }
            }
        }
        if(ok)fout<<"DA"<<'\n';
    }
    return 0;
}