Cod sursa(job #2051383)

Utilizator DawlauAndrei Blahovici Dawlau Data 28 octombrie 2017 21:36:58
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<fstream>
#include<list>
#include<queue>
#include<string>
#include<bitset>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50005,INF=NMAX*1000;
struct graph{
    int next_node,cost;
};
list<graph>g[NMAX];
int ans[NMAX],dist[NMAX],t,n,m,source_node;
bitset<NMAX>in_queue;
class cmp{
    bool ok;
    public:
        bool operator()(const int &a,const int &b)const{
            if(ok) return dist[a]<dist[b];
            return dist[a]<dist[b];
        }
};
void read_graph(){
    int from,to,cost,i;
    fin>>n>>m>>source_node;
    for(i=1;i<=n;++i)
        fin>>ans[i];
    while(m--){
        fin>>from>>to>>cost;
        g[from].push_back({to,cost});
        g[to].push_back({from,cost});
    }
}
void dijkstra(){
    int node;
    priority_queue<int,vector<int>,cmp>pq;
    pq.push(source_node);
    fill(dist+1,dist+1+n,INF);
    dist[source_node]=0;
    list<graph>::iterator it;
    while(!pq.empty()){
        node=pq.top();
        pq.pop();
        in_queue[node]=false;
        for(it=g[node].begin();it!=g[node].end();++it)
            if(dist[it->next_node]>dist[node]+it->cost){
                dist[it->next_node]=dist[node]+it->cost;
                if(!in_queue[it->next_node]){
                    in_queue[it->next_node]=true;
                    pq.push(it->next_node);
                }
            }
    }
}
string matching_results(){
    int i;
    for(i=1;i<=n;++i)
        if(dist[i]!=ans[i])
            return "NU";
    return "DA";
}
void clear_graph(){
    int i=1,j=n;
    while(i<=j){
        g[i].clear();
        g[j].clear();
        ++i;
        --j;
    }
}
void solve(){
    fin>>t;
    while(t--){
        read_graph();
        dijkstra();
        fout<<matching_results()<<'\n';
        clear_graph();
    }
}
int main(){
    solve();
}