Pagini recente » Cod sursa (job #3288497) | Cod sursa (job #167341) | Cod sursa (job #2157368) | Cod sursa (job #2198369) | Cod sursa (job #1701790)
#include <bits/stdc++.h>
const int DIM = 1 << 10;
using namespace std;
int N, M, K, node1, node2, cost, Marked[DIM], Good[DIM], V[DIM * DIM], L;
struct edge{ int node, cost; }; vector <edge> Edge[DIM]; int List[DIM][DIM];
class input_reader {
private:
FILE *input_file;
static const int SIZE = 1 << 17;
char buffer[SIZE]; int cursor;
inline void advance() {
if( ++cursor == SIZE ) {
cursor = 0;
fread( buffer, SIZE, 1, input_file );
}
return;
}
inline char current() {
return buffer[cursor];
}
public:
input_reader( const char *file_name, const char *file_type ) {
input_file = fopen( file_name, file_type ); cursor = 0;
fread( buffer, SIZE, 1, input_file );
}
input_reader &operator >>( int &value ) {
value = 0;
while( current() < '0' || current() > '9' )
advance();
while( current() >= '0' && current() <= '9' ) {
value = value * 10 + ( current() - '0' );
advance();
}
return *this;
}
} input_file( "pitici.in", "r" );
FILE *output_file = fopen( "pitici.out", "w" );
void DFS( int node ) {
Marked[node] = 1;
if( node == N ) {
Good[node] = 1;
List[N][ ++List[N][0] ] = 0;
return;
}
vector <edge> :: iterator it;
for( it = Edge[node].begin(); it != Edge[node].end(); it ++ ) {
edge next_node = *it;
if( !Marked[next_node.node] )
DFS( next_node.node );
}
L = 0;
for( it = Edge[node].begin(); it != Edge[node].end(); it ++ ) {
edge next_node = *it;
if( Good[next_node.node] ) {
Good[node] = 1;
for( int i = 1; i <= List[next_node.node][0]; i ++ )
V[++L] = List[next_node.node][i] + next_node.cost;
if( L <= K )
sort( V + 1, V + L + 1 );
else {
partial_sort( V + 1, V + K + 1, V + L + 1 );
L = K;
}
}
}
for( int i = 1; i <= K && i <= L; i ++ )
List[node][ ++List[node][0] ] = V[i];
return;
}
int main() {
input_file >> N >> M >> K;
for( int i = 1; i <= M; i ++ ) {
input_file >> node1 >> node2 >> cost;
Edge[node1].push_back( {node2, cost} );
}
DFS( 1 );
for( int i = 1; i <= List[1][0]; i ++ )
fprintf( output_file, "%d ", List[1][i] );
return 0;
}