题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1854
刚开始网络流TLE了,无奈只能敲第一次的匈牙利算法,还好不难。。。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <bitset>
using namespace std ;
#define MAXN 2100000
struct edge {
int t ;
edge *next ;
} *head[ MAXN ] ;
void AddEdge( int s , int t ) {
edge *p = new( edge ) ;
p -> t = t , p -> next = head[ s ] ;
head[ s ] = p ;
}
bitset < MAXN > f ;
int match[ MAXN ] ;
bool aug( int v ) {
for ( edge *p = head[ v ] ; p ; p = p -> next ) if ( ! f[ p -> t ] ) {
f[ p -> t ] = 1 ;
if ( ! match[ p -> t ] || aug( match[ p -> t ] ) ) {
match[ p -> t ] = v ;
return true ;
}
}
return false ;
}
int n , Max = 0 ;
int main( ) {
memset( head , 0 , sizeof( head ) ) ;
memset( match , 0 , sizeof( match ) ) ;
scanf( "%d" , &n ) ;
for ( int i = 0 ; i ++ < n ; ) {
int x , y ;
scanf( "%d%d" , &x , &y ) ;
Max = max( Max , max( x , y ) ) ;
AddEdge( x , i ) , AddEdge( y , i ) ;
}
for ( int i = 0 ; i ++ < Max ; ) {
f.reset( ) ;
if ( ! aug( i ) ) {
printf( "%d\n" , i - 1 ) ;
return 0 ;
}
}
printf( "%d\n" , Max ) ;
return 0 ;
}