《算法基础》 二分图
1.染色法判断二分图
# include <iostream>
# include <algorithm>
# include <cstring>
using namespace std;
const int N = 100010 , M = 200010 ;
int h[ N] , e[ M] , ne[ M] , idx;
int color[ N] ;
int n, m;
void add ( int a, int b)
{
e[ idx] = b; ne[ idx] = h[ a] ; h[ a] = idx ++ ;
}
int dfs ( int u, int c)
{
color[ u] = c;
for ( int i = h[ u] ; i != - 1 ; i = ne[ i] ) {
int j = e[ i] ;
if ( ! color[ j] ) {
if ( ! dfs ( j, 3 - c) ) return false ;
}
else if ( color[ j] == c) return false ;
}
return true ;
}
int main ( )
{
cin >> n >> m;
memset ( h, - 1 , sizeof h) ;
while ( m -- ) {
int a, b;
scanf ( "%d%d" , & a, & b) ;
add ( a, b) ;
add ( b, a) ;
}
bool flag = true ;
for ( int i = 1 ; i <= n; i ++ ) {
if ( ! color[ i] ) {
if ( ! dfs ( i, 1 ) ) {
flag = false ;
break ;
}
}
}
if ( flag == true ) cout << "Yes" << endl;
else cout << "No" << endl;
return 0 ;
}
2.匈牙利算法
# include <iostream>
# include <algorithm>
# include <cstring>
using namespace std;
const int N = 510 , M = 100010 ;
int h[ N] , e[ M] , ne[ M] , idx;
int match[ N] ;
bool st[ N] ;
int n1, n2, m;
void add ( int a, int b)
{
e[ idx] = b; ne[ idx] = h[ a] ; h[ a] = idx ++ ;
}
bool find ( int x)
{
for ( int i = h[ x] ; i != - 1 ; i = ne[ i] ) {
int j = e[ i] ;
if ( ! st[ j] ) {
st[ j] = 1 ;
if ( match[ j] == 0 || find ( match[ j] ) ) {
match[ j] = x;
return true ;
}
}
}
return false ;
}
int main ( )
{
cin >> n1 >> n2 >> m;
memset ( h, - 1 , sizeof h) ;
while ( m -- ) {
int a, b;
scanf ( "%d%d" , & a, & b) ;
add ( a, b) ;
}
int res = 0 ;
for ( int i = 1 ; i <= n1; i ++ ) {
memset ( st, 0 , sizeof st) ;
if ( find ( i) ) res ++ ;
}
cout << res << endl;
return 0 ;
}