Cod sursa(job #1193324)

Utilizator tudi98Cozma Tudor tudi98 Data 31 mai 2014 14:28:34
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define dim 50001
#define inf 0x3f3f3f3f
using namespace std;
 
struct  comp{
    bool operator() (const pii &a,const pii &b)
    {
        return a.y>b.y;
    }
};
 
 
priority_queue <pii,vector<pii>,comp > H;
vector <pii> v[dim];
 
int m,n,s,dist[dim],db[dim];
bool seen[dim]; 

ifstream f("distante.in");
ofstream g("distante.out");
 
 
 
void read(){
     
 
    for(int i=1;i<=n;i++){
        v[i].clear();
    }
 
    int a,b,c;
    f>>n>>m>>s;
    for(int i=1;i<=n;i++)
        f>>db[i];         
 
    for(int i=1;i<=m;i++){
        f>>a>>b>>c;
        v[a].pb(mp(b,c));
        v[b].pb(mp(a,c));
    }
}
 
inline bool verif(){
	for(int i=1;i<=n;i++)
		if(db[i]!=dist[i]) return 0;
	return 1;
}	

 
void Dijkstra(){
     
    int u,d,newd;
    memset(dist,inf,sizeof(dist));
    dist[s]=0;
    H=priority_queue<pii,vector<pii>,comp>();	
    H.push(mp(s,0));
    while(!H.empty()){
        u=H.top().x;
        d=H.top().y;
        H.pop();
        for(int i=0;i<int(v[u].size());i++){
            newd=d+v[u][i].y;
            if(newd<dist[v[u][i].x]){
                dist[v[u][i].x]=newd;
		if(newd<db[v[u][i].x]){ g << "NU\n"; return; }
                else H.push(mp(v[u][i].x,newd));
            }
        }
    }

    if(verif()) g << "DA\n";
    else g << "NU\n";	
}
 
 
int main(){
     
    int t;
    f>>t;
    for(int i=1;i<=t;i++){
        read();
        Dijkstra(); 
    }   
}