#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;
}
最简单的数据错了
呜呜呜