Cod sursa(job #964341)

Utilizator alinaelenaFMI Colceag Alina alinaelena Data 20 iunie 2013 17:27:28
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include<cstdio>
#include<fstream>
#include<vector>
#include<queue>
    
#define INFINIT 1<<30
#define DIM 50001
 int dist[DIM]; int s;
    
using namespace std;
    
    int drum[DIM];
       
    
vector< pair<int,int> >graf[DIM];
    
void set_inf(int n)
{
      for(int i=1;i<=n;++i)
      {
        drum[i]=INFINIT;
    }
}
   
int ciclu[DIM];
int ok;
   
/*int print (int start,int n)
{
    if (ok)
      {
          for(int i=1;i<=n;++i){
        if(drum[i]==INFINIT)
            drum[i]=0;
    
        if(start!=i)
        if(dist[i]!=drum[i])
            return 0;}
             
  return 1;
      }
}*/
   
   
   
void bellford(int start,int n){
    
   
    int nod;
    queue <int> queue_graf;
    
    set_inf(n);
     
    
    drum[start]=0;
    queue_graf.push(start);
    ok=1;
    
    while(queue_graf.empty()==0){
    
        nod=queue_graf.front();
        queue_graf.pop();
    
        for( int i=0; i<graf[nod].size();++i ){
            if(dist[nod]>dist[graf[nod][i].first]+graf[nod][i].second || dist[graf[nod][i].first]> dist[nod]+graf[nod][i].second)
             {printf("NU\n");return;}
			 else
			  queue_graf.push(graf[nod][i].first);
        }
    
    }
  printf("DA\n");


    
}
    
void setdrum(int n)
{
	for(int i=1;i<=n;++i)
		drum[i]=0;
}
  
int main(){
    freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
    int A,B,C,n,m;
    int t;
  
  scanf("%d",&t);
 for (int i=1;i<=t;++i)
{
	//setdrum(n);
  scanf("%d%d",&n,&m);
 scanf("%d",&s);
 
 for (int i=1;i<=n;++i)
    scanf("%d",&dist[i]);
  
    for(int j=1;j<=m;j++){
    
            scanf("%d %d %d",&A,&B,&C);
            graf[A].push_back(make_pair(B, C));
    
        }
    
    bellford(s,n);
}
  
   
      
}