rendered paste body#include <stdio.h>
#include <stdlib.h>
using namespace std;
class pdata {
public:
int* city_1;
int* city_2;
int* dist_b;
int st_city;
int en_city;
int t_cities;
int t_roads;
int min_dist;
bool first_time;
} pd;
int find_minimum_distance( int given_city , int cur_dist , int table[] , int num_of_cities_in_table );
int main( void ) {
int i;
FILE *apo_in = fopen("apollon.in","r"), *apo_out = fopen("apollon.out","w");
pd.min_dist = 0;
pd.first_time = true;
fscanf( apo_in , "%i %i\n" , &pd.t_cities , &pd.t_roads );
pd.city_1 = ( int* )malloc( pd.t_roads * sizeof( int ) );
pd.city_2 = ( int* )malloc( pd.t_roads * sizeof( int ) );
pd.dist_b = ( int* )malloc( pd.t_roads * sizeof( int ) );
for( i = 1 ; i < pd.t_roads + 1 ; i++ )
fscanf( apo_in , "%i %i %i\n" , &pd.city_1[ i ] , &pd.city_2[ i ] , &pd.dist_b[ i ] );
fscanf( apo_in , "%i %i\n" , &pd.st_city , &pd.en_city );
fclose( apo_in );
int* table;
table = ( int* )malloc( pd.t_cities * sizeof( int ) );
find_minimum_distance( pd.st_city , 0 , table , 0 );
fprintf( apo_out , "%i\n" , pd.min_dist );
fclose( apo_out );
return( 0 );
}
int find_minimum_distance( int given_city , int cur_dist , int table[] , int num_of_cities_in_table ) {
bool passed_city = false;
int i;
int j;
if( given_city == pd.en_city ) {
if( cur_dist < pd.min_dist || pd.first_time == true ) {
pd.min_dist = cur_dist;
pd.first_time = false;
}
}
else {
num_of_cities_in_table++;
table[ num_of_cities_in_table ] = given_city;
for( i = 1 ; i < pd.t_roads + 1 ; i++ ) {
if( pd.city_1[ i ] == given_city ) {
passed_city = false;
j = 1;
while( j < num_of_cities_in_table + 1 && passed_city == false ) {
if( table[ j ] == pd.city_2[ i ] )
passed_city = true;
else
j++;
}
if( passed_city == false ) {
cur_dist = cur_dist + pd.dist_b[ i ];
if( cur_dist < pd.min_dist || pd.first_time == true )
find_minimum_distance( pd.city_2[ i ] , cur_dist , table , num_of_cities_in_table );
cur_dist = cur_dist - pd.dist_b[ i ];
}
}
passed_city = false;
if( pd.city_2[ i ] == given_city ) {
passed_city = false;
j = 1;
while( j < num_of_cities_in_table + 1 && passed_city == false ) {
if( table[ j ] == pd.city_1[ i ] )
passed_city = true;
else
j++;
}
if( passed_city == false ) {
cur_dist = cur_dist + pd.dist_b[ i ];
if( cur_dist < pd.min_dist || pd.first_time == true )
find_minimum_distance( pd.city_1[ i ] , cur_dist , table , num_of_cities_in_table );
cur_dist = cur_dist - pd.dist_b[ i ];
}
}
}
}
return( 0 );
};