Cod sursa(job #357871)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 20 octombrie 2009 21:59:31
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio> 
#include <vector> 
#define DIM 50002
#define INFI 0x3f3f3f3f
#define DIM2 8192
#define CoadaMax 1<<20
using namespace std;

vector <int> G[DIM], Cost[DIM];
int n, i, c[CoadaMax], visited[DIM], v[DIM], sursa;
char vec[DIM2];
int poz;
void citeste(int &x)   
{   
  x=0;   
  while(vec[poz]<'0' || vec[poz]>'9')   
       if(++poz==DIM2) fread(vec,1,DIM2,stdin),poz=0;   
  
    while(vec[poz]>='0' && vec[poz]<='9')   
    {   
        x=x*10+vec[poz]-'0';   
        if(++poz==DIM2) fread(vec, 1, DIM2, stdin),poz=0;   
    }  
}  
void solve(int k) {
     
     int x, p, u;
     bool fellow[DIM];
     for (i=1; i<=n; i++) visited[i]=INFI;
     memset (fellow, false, sizeof(fellow));
     p = u = 0;
     c[u] = k;
     visited[k] = 0;          
     while ( p <= u ) {
           x = c[ p++ ];
           fellow[x] = false;
           for (i = 0; i < G[x].size(); ++i) {
               if (Cost[x][i] + visited[x] < visited [ G[x][i] ]) {
                    visited[ G[x][i] ] = Cost[x][i] + visited[x];
                    if ( fellow[G[x][i]]==false ) {
                         c[ ++u ] = G[x][i];
                         fellow[ G[x][i] ] = true;
                         }
                   }
               }
           }
}
int test()
{
     for (i=1; i<=n; i++) {
         if (visited[i]==INFI) { if (v[i]) return 0; }
         else if (visited[i] != v[i] ) return 0;
         }
return 1;  
}
void read() {
     
     int x, y, c, m, T;
     citeste(T);
     while ( T-- ) {
           
           memset( G, 0, sizeof(G) );
           memset( Cost, 0, sizeof(Cost) );
           citeste (n);
           citeste (m);
           citeste(sursa);
           for (i=1; i<=n; i++) citeste( v[i] );
           for ( ; m-- ; ) {
               citeste (x); citeste (y); citeste (c);
               G[x].push_back(y);
               G[y].push_back(x);
               Cost[x].push_back(c);
               Cost[y].push_back(c);
           }
         solve(sursa);
         if (test()) printf ("DA\n");
         else printf("NU\n");
         }
}
int main()
{
    freopen ("distante.in","r",stdin);
    freopen ("distante.out","w",stdout);
    read();
    return 0;
}