Solution of ZJOI2012-旅游
题解:
把三角形当做一个点 , 与他共边的点和他连一条边 , 构成一颗二叉树
题目要求就转化为求树的直径 , 两边dfs即可
存三角形珂以用map , 寻找复杂度 O ( l o g N ) O(logN) O(logN)极其优秀
demo:
# include <iostream>
# include <cstdio>
# include <map>
# include <vector>
# include <queue>
# include <cstring>
using namespace std ;
struct pairwork{
int fir , sed , siz ;
pairwork () : fir ( -1 ) , sed ( -1 ) , siz ( 0 ) { }
pairwork ( int x , int y ) : fir ( x ) , sed ( y ) , siz ( 2 ) { }
void push ( int id ){
if( fir == -1 ) fir = id , ++ siz ;
else if( sed == -1 ) sed = id , ++ siz ;
}
bool chk ( ) {
return siz > 1 ;
}
bool operator < ( const pairwork & x ) const {
if ( fir == x . fir ) return sed < x . sed ;
return fir < x . fir ;
}
};
map< pairwork , pairwork > edge ;
vector< int > graph [ 200005 ] ;
void sort ( int & a , int & b , int & c){
if ( a > b ) swap ( a , b ) ;
if ( a > c ) swap ( a , c ) ;
if ( b > c ) swap ( b , c ) ;
}
int dis [ 200005 ] ;
int vis [ 200005 ] ;
int tp , n ;
int bfs ( int s , int _t ) {
tp = 0 ;
queue < int > Q ;
dis[ s ] = 0 , vis [ s ] = _t ;
Q.push( s ) ;
while( ! Q . empty( ) ) {
tp = Q . front ( ) ; Q . pop ( ) ;
for( vector<int>::iterator it = graph [ tp ] . begin( ) ; it != graph [ tp ] .end( ) ; ++ it ) {
if( vis [ *it ] == _t) continue ;
vis [ *it ] = _t ; dis [ *it ] = dis [ tp ] + 1 ; Q.push( *it ) ;// cout<< "Inq : " << *it <<endl ;
}
}
return tp ;
}
void wk( ) {
int Qb1 = bfs ( 1 , 1 ) , Qb2 = bfs ( Qb1 , 2 ) ;
printf ( "%d\n" , dis [ Qb2 ] + 1 ) ;
}
int main(){
scanf( "%d" , & n ) ;
for( int i = 1 ; i <= n - 2 ; ++ i ) {
int x , y , z ;
scanf( "%d%d%d" , & x, & y , & z ) ;
sort ( x , y , z ) ;
edge [ pairwork ( x , y ) ] . push ( i ) ;
edge [ pairwork ( y , z ) ] . push ( i ) ;
edge [ pairwork ( x , z ) ] . push ( i ) ;
}
for( map < pairwork , pairwork >::iterator it = edge . begin ( ) ; it != edge . end ( ) ; ++ it ) {
if( it -> second . siz > 1 ) {
graph [ it -> second . fir ] . push_back ( it -> second . sed ) ;
graph [ it -> second . sed ] . push_back ( it -> second . fir ) ;
}
}
//for( int i = 1 ; i <= n - 2 ; ++i ) {
// printf( "%d : ", i ) ;
// for( vector<int>::iterator it = graph [ i ] . begin( ) ; it != graph [ i ] .end( ) ; ++ it )
// printf( "%d " , *it ) ;
// puts("") ;
//}
wk ( ) ;
}