救救!70分代码
查看原帖
救救!70分代码
476081
Jeff_赵楼主2024/9/6 15:36
#include <bits/stdc++.h>

using namespace std;

const int N = 4e4 + 10 ; 
int title[ N ] , dish [ N ] , low[ N ] , dist = 0 ;
int top = 0 ; 
int tot = 0 ;
int stack_num[ N ] ; 
struct NODE
{
	int data ;
	int next ; 
}dt[ N ] ;
vector< int > vec[ 10000 ] ;
int n , m , tip = 0 , root  ;
bool mape[ N ] ;
void add( int x , int y )
{
	dt[ ++ tot ].data = y ;
	dt[ tot ].next = title[ x ];
	title[ x ] = tot ; 
} 

void tarjan( int now_data )
{
	if( now_data == root && title[ now_data ] == -1 ) 
	{
		vec[ ++ tip ].push_back( now_data ) ;
		return;
	}
	dish[ now_data ] = low[ now_data ] = ++ dist ;
	stack_num[ ++ top ] = now_data ;
	int flage = 0 ; 
	
	for( int i = title[ now_data ] ; i != -1 ; i = dt[ i ].next )
	{
		if( !dish[ dt[ i ].data ] ) 
		{
			tarjan( dt[ i ].data ) ;
			low[ now_data ] = min( low[ now_data ] , low[ dt[ i ].data ]) ;
			if( dish[ now_data ] <=  low[ dt[ i ].data ] )
			{
				++ flage ;
				if( now_data != root || flage > 1 ) mape[ now_data ] = 1 ; 
				int y ; 
				++ tip ;
				mape[ now_data ] = 1;  
				do 
				{
					y = stack_num[ top -- ];
					vec[ tip ].push_back( y ) ;
				}while( y != dt[ i ].data );
				vec[ tip ].push_back( now_data );
			}
		}
		else 
			low[ now_data ] = min( low[ now_data ] ,dish[ dt[ i ].data ] ); 
	}
}

int main()
{
	int total = 0 ;
	while( cin >> m , m )
	{
		for(int i = 1; i <= tip  ; i ++ )
			vec[ i ].clear();
		memset( title , -1 , sizeof( title ) ) ;
		memset( dish , 0 , sizeof( dish ) ) ;
		memset( mape , 0 , sizeof( mape ) ) ;
		top = 0 ;
		tip = 0 ; 
		dist= 0 ; 
		tot = 0 ;
		int max_dist = -1 ; 
		for( int i = 1 ; i <= m ; i ++ )
		{
			int x , y ;
			scanf( "%d%d" , &x , &y ) ;
			add( x , y ) ;
			add( y , x ) ;
			max_dist = max( max_dist , y ) ;
			max_dist = max( max_dist , x ) ; 
		} 
		
		for( int i = 1 ; i <= max_dist ; i ++ )
			if( !dish[ i ] )
			{
				root = i ;
				tarjan( i ) ;
			}
		unsigned int ans = 0 ; 
		unsigned long long num = 1 ;
 		for(int i = 1 ; i <= tip ; i ++ )
		{
			int con = 0 ; 
			for( vector< int >::iterator it = vec[ i ].begin( ) ; it != vec[ i ].end() ; it ++ )
				if( mape[ *it ] == 1 )
					++ con ; 
			 
			if( con == 0 ) 
			{
				if( vec[ i ].size() > 1 )
				{
					num *=  vec[ i ].size( ) * ( vec[ i ].size( ) - 1 ) / 2  ;
					ans = 2 + ans ;
				}
				else ans ++ ;
			}
			else if( con == 1 ) 
			{
				num *= ( vec[ i ].size() - con );
				ans += 1;
			}
			
		}
//		cout << ans << " " << num << endl ;
//		printf( "Case %d: %d %llu\n" , ++total , ans , num ) ;
		total ++ ;
		printf( "Case %d: %d %llu\n" , total , ans , num ) ;
	}
	return 0;
} 

最简单的数据错了 呜呜呜

2024/9/6 15:36
加载中...