BZOJ4443[Scoi2015][小凸玩矩陣] 二分圖最大匹配+二分

題目鏈接


題解:二分第K大的值,把小於這個值的邊加入圖中,再求最大匹配,看能不能找出n-k+1個數<=mid

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 305 ;

int lk [N] , w [N] [N] , vis [N] ;
int n , m , mid , k ;

bool find ( int u ){
    for ( int i = 1 ; i <= m ; ++ i )
        if ( w [u] [i] <= mid && ! vis [i] ) {
            vis [i] = 1 ;
            if ( lk [i] == 0 || find ( lk [i] ) ){
                lk [i] = u;
                return true ;
            }
        }
    return false ;  
}

bool check (){
    int ans = 0 ;
    memset ( lk, 0 , sizeof ( lk ) );
    for ( int i = 1 ; i <= n ; ++ i ){
        memset ( vis , 0 , sizeof ( vis ) );
        ans += find ( i ) ;
    }
    return ans > n - k ;
}

int main() {
    scanf ( "%d%d%d", &n , &m , &k );
    for ( int i = 1 ; i <= n ; ++ i )
        for ( int j = 1; j <= m ; ++ j )
            scanf ( "%d" , &w [i] [j] );
    int l = 1 , r = 1e9 , ans = 1;
    while ( l <= r ) {
        mid = ( l + r ) >> 1;
        if ( check () ) r = mid - 1 , ans = mid ;
        else l = mid + 1; 
    }
    printf ( "%d" , l ) ;
    return 0 ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章