Cod sursa(job #200443)

Utilizator alexeiIacob Radu alexei Data 23 iulie 2008 22:37:42
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<stdio.h>
#include<vector>
#define nmax 50024
using namespace std;
vector < pair<int,int> >q[nmax];
vector < pair <int,int> >::iterator it;

int dmin[nmax];
bool v[nmax];
int viz[nmax],t,S;
int space[nmax];
bool aha[nmax];

int check_up(const int N)
{
 int inc=1,sf=1;
 int a1,a2,a,b;
 int nod;
 space[ viz[1] ]=0;
 while(inc<=sf)
 {
 nod=viz[inc];
 v[ nod ]=true;
 a=space[nod];
 
 for(it=q[nod].begin(); it!=q[nod].end(); ++it)
 {
               a1=it->first;
               a2=it->second;
               b=space[a1]; 
               if( a1!=S )
                if( !b || a<b){ 
                   if( dmin[a1]> dmin[nod]+a2 || !dmin[a1] )
                   return 0;
                   }
                else
                   if( a>b )
                       if( dmin[nod]+a2 < dmin[a1] ){
                       return 0;
                       }
               if( dmin[nod]+a2==dmin[a1] )
               aha[a1]=true;
                                     
               if( v[a1]==false ){
                   space[ a1 ]=a+1;
                   viz[++sf]=a1,v[a1]=true;
               }
 }
 ++inc;
 }

int i,w=0;

for(i=1; i<=N; ++i)
         if(aha[i]==false){
         return 0;
         } 
if( sf==N )
return 1;

return 0;
}

int main()
{
 freopen("distante.in","r",stdin);
 freopen("distante.out","w",stdout);
 
 int T,N,M;
 int i;
 int a1,a2,a3;
 scanf("%d",&T);
 
 while( T-- )
 {
        scanf("%d%d%d",&N,&M,&S);
        for(i=1; i<=N; ++i) scanf("%d",&dmin[i]),v[i]=false,q[i].clear(),aha[i]=false;
        v[S]=true;viz[1]=S;
        aha[S]=true;
        for(i=1; i<=M; ++i){
        scanf("%d%d%d",&a1,&a2,&a3);
        q[a1].push_back(make_pair(a2,a3));
        q[a2].push_back(make_pair(a1,a3));
        }
        
        if( dmin[S] || !check_up(N))
        printf("NU\n");
        else
        printf("DA\n");
               
 }
 
    return 0;
}