Pagini recente » Cod sursa (job #1763430) | Cod sursa (job #214599) | Cod sursa (job #844792) | Cod sursa (job #664805) | Cod sursa (job #1934868)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string.h>
using namespace std;
const int N = 16001;
const int INF = 1e9 ;
int noNodes ;
vector < pair < int , int > > edges[ N ];
int firstDistToLeaf [ N ], secondDistToLeaf[ N ] , longestDistUp[ N ] , sol[ N ];
int viz [ N ] ;
void CalculateDist ( int node ){
vector < pair < int , int > >:: iterator it ;
int vec , costMuchie ;
viz [ node ] = 1 ;
for ( it = edges [ node ].begin() ; it != edges [ node ].end() ; it++ ){
vec = it->first ;
costMuchie = it->second ;
if ( viz [ vec ] ){
continue ;
}
CalculateDist( vec ) ;
if ( firstDistToLeaf [ node ] < firstDistToLeaf [ vec ] + costMuchie ){
secondDistToLeaf [ node ] = firstDistToLeaf [ node ] ;
firstDistToLeaf [ node ] = firstDistToLeaf [ vec ] + costMuchie ;
}else if ( secondDistToLeaf [ node ] < firstDistToLeaf [ vec ] + costMuchie ){
secondDistToLeaf [ node ] = firstDistToLeaf [ vec ] + costMuchie ;
}
}
// if ( firstDistToLeaf[ node ] == INF ){
// firstDistToLeaf [ node ] = 0 ;
// }
//
// if ( secondDistToLeaf [ node ] == INF ){
// secondDistToLeaf [ node ] = 0 ;
// }
}
void FindSolution ( int node ){
vector < pair < int , int > >:: iterator it ;
int vec , costMuchie ;
viz [ node ] = 1 ;
sol [ node ] = max ( firstDistToLeaf [ node ] , longestDistUp [ node ] );
for ( it = edges [ node ].begin() ;it != edges [ node ].end() ; it++ ){
vec = it->first ;
costMuchie = it->second ;
if ( viz [ vec ] ){
continue ;
}
longestDistUp [ vec ] = longestDistUp [ node ] + costMuchie ;
if ( firstDistToLeaf[ node ] - costMuchie == firstDistToLeaf [ vec ] ){
longestDistUp [ vec ] = max ( longestDistUp [ vec ] , secondDistToLeaf [ node ] + costMuchie );
}else{
longestDistUp [ vec ] = max ( longestDistUp [ vec ] , firstDistToLeaf [ node ] + costMuchie );
}
FindSolution( vec );
}
}
void INIT (){
static int i ;
for ( i = 1 ; i <= noNodes ; i ++ ){
edges [ i ].clear() ;
firstDistToLeaf [ i ] = secondDistToLeaf [ i ] = 0 ;
}
memset ( viz , 0 , sizeof viz );
}
int main(){
int noTests , crTest ;
int x , y , cost ;
int i ;
freopen("razboi.in","r",stdin);
freopen("razboi.out","w",stdout);
scanf("%d",&noTests);
for ( crTest = 1 ; crTest <= noTests ; crTest ++ ){
scanf("%d",&noNodes );
INIT();
for ( i = 1 ; i < noNodes ; i++ ){
scanf("%d %d %d", &x ,&y , &cost );
edges [ x ].push_back ( make_pair( y ,cost ) );
edges [ y ].push_back ( make_pair( x ,cost ) );
}
CalculateDist( 1 );
memset ( viz , 0 , sizeof viz );
FindSolution(1);
int minSol ;
minSol = INF ;
for ( i = 1 ; i < noNodes ; i++ ){
minSol = min( minSol , sol [ i ] );
}
printf("Testul nr #%d\n",crTest);
// printf("%d\n",minSol);
for ( i = 1 ; i <= noNodes ; i++ ){
if ( sol [ i ] == minSol ){
printf("%d\n",i);
}
}
}
return 0;
}