Pagini recente » Cod sursa (job #2516282) | Cod sursa (job #2211826) | Cod sursa (job #2768167) | Cod sursa (job #1252563) | Cod sursa (job #1819371)
# include <cstdio>
# include <fstream>
# include <vector>
# include <queue>
using namespace std;
class ifbuffer {
private:
char text[100000];
int size;
int pos;
bool isDigit[128];
FILE *file;
inline void refill( void ) {
pos = 0;
fread( text, 1, size, file );
}
inline char getc() {
char c = text[pos ++];
if ( pos == size )
refill();
return c;
}
inline int getnr() {
char c = getc();
int nr = 0, p;
while ( !isDigit[c] && c != '-' )
c = getc();
if ( c == '-' ) {
p = -1;
c = getc();
} else
p = 1;
while ( isDigit[c] ) {
nr = nr * 10 + c - '0';
c = getc();
}
return nr * p;
}
public:
inline ifbuffer( char * path, int s = 100000 ) {
size = s;
file = fopen( path, "r" );
int i;
for ( i = 0; i < '0'; i ++ )
isDigit[i] = false;
for ( i = '0'; i <= '9'; i ++ )
isDigit[i] = true;
for ( i = '9' + 1; i < 128; i ++ )
isDigit[i] = false;
refill();
}
inline ifbuffer &operator>>( int &v ) {
v = getnr();
return *this;
}
inline ifbuffer &operator>>( char &v ) {
v = getc();
return *this;
}
inline void close() {
fclose( file );
}
};
class ofbuffer {
private:
char text[100000];
int size;
int pos;
bool isDigit[128];
FILE *file;
inline void clear( void ) {
pos = 0;
fwrite( text, 1, size, file );
}
inline void putc( char c) {
text[pos ++] = c;
if ( pos == size )
clear();
}
inline void putnr( int nr ) {
if ( nr < 0 ) {
putc( '-' );
nr =- nr;
}
int p10;
for ( p10 = 1; p10 * 10LL <= nr; p10 *= 10 );
for ( ; p10 > 0; p10 /= 10 )
putc( nr / p10 % 10 + '0' );
}
public:
inline ofbuffer( char * path, int s = 100000 ) {
size = s;
file = fopen( path, "w" );
int i;
for ( i = 0; i < '0'; i ++ )
isDigit[i] = false;
for ( i = '0'; i <= '9'; i ++ )
isDigit[i] = true;
for ( i = '9' + 1; i < 128; i ++ )
isDigit[i] = false;
}
inline ofbuffer &operator<<( int v ) {
fprintf( file, "%d", v );
return *this;
}
inline ofbuffer &operator<<( char v ) {
fputc( v, file );
return *this;
}
inline void close() {
fclose( file );
}
};
# define MAX_N 50000
int dist[1 + MAX_N];
bool check[1 + MAX_N];
# define undefined -1
struct path
{
int dist, dest;
path( int _dest, int _dist )
{
dest = _dest;
dist = _dist;
}
};
vector<path> v[MAX_N];
class cmp
{
public:
bool operator()( path a, path b )
{
return a.dist > b.dist;
}
};
int main()
{
ifbuffer fin( "distante.in" );
ofbuffer fout( "distante.out" );
ios::sync_with_stdio( false );
int t;
fin >> t;
for ( ; t > 0; t -- ) {
int n, m, s, i, a, b, c;
priority_queue<path, vector<path>, cmp> dix;
bool r = true;
fin >> n >> m >> s;
for ( i = 1; i <= n; i ++ ) {
v[i].clear();
check[i] = false;
fin >> dist[i];
}
for ( i = 0; i < m; i ++ ) {
fin >> a >> b >> c;
v[a].push_back( path( b, c ) );
v[b].push_back( path( a, c ) );
}
dix.push( path( s, 0 ) );
while ( dix.size() && r ) {
path t = dix.top();
dix.pop();
if ( check[t.dest] )
continue;
if ( dist[t.dest] != t.dist )
r = false;
else {
check[t.dest] = true;
for ( path i : v[t.dest] )
dix.push( path( i.dest, i.dist + t.dist ) );
}
}
for ( i = 1; i <= n; i ++ )
if ( check[i] == false && dist[i] != 0 )
r = 0;
if ( r )
fout << 'D' << 'A';
else
fout << 'N' << 'U';
fout << '\n';
}
fin.close();
fout.close();
return 0;
}