Cod sursa(job #1934868)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 21 martie 2017 21:21:04
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.41 kb
#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;
}