"SCOI2015" play small convex matrix

Topic Link

problem analysis

Subject to ample hints, we need only half the answer and then ran to Hungary.To believe that the speed of Hungary

Reference program

#include <bits/stdc++.h>
using namespace std;

const int Maxn = 310;
const int INF = 2147483647;
int N, M, K, A[ Maxn ][ Maxn ], Max, Min;
int Map[ Maxn ][ Maxn ], Vis[ Maxn ], Mx[ Maxn ], My[ Maxn ];

int Dfs( int x ) {
    for( int i = 1; i <= M; ++i ) {
        if( Map[ x ][ i ] == 0 ) continue;
        if( Vis[ i ] ) continue;
        Vis[ i ] = 1;
        if( My[ i ] == 0 || Dfs( My[ i ] ) ) {
            Mx[ x ] = i; My[ i ] = x;
            return 1;
        }
    }
    return 0;
}

bool Check( int Mid ) {
    memset( Map, 0, sizeof( Map ) );
    memset( Mx, 0, sizeof( Mx ) );
    memset( My, 0, sizeof( My ) );
    for( int i = 1; i <= N; ++i ) 
        for( int j = 1; j <= M; ++j ) 
            if( A[ i ][ j ] <= Mid ) Map[ i ][ j ] = 1;
    int Ans = 0;
    for( int i = 1; i <= N; ++i ) {
        memset( Vis, 0, sizeof( Vis ) );
        Ans += Dfs( i );
    }
    return Ans >= ( N - K + 1 );
}

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", &A[ i ][ j ] );
    Max = 0, Min = INF;
    for( int i = 1; i <= N; ++i ) 
        for( int j = 1; j <= M; ++j ) 
            Max = max( A[ i ][ j ], Max ), Min = min( A[ i ][ j ], Min );
    int Ans = 0;
    while( Max >= Min ) {
        int Mid = ( Max + Min ) >> 1;
        if( Check( Mid ) ) Ans = Mid, Max = Mid - 1; else Min = Mid + 1;
    }
    printf( "%d\n", Ans );
    return 0;
}

Guess you like

Origin www.cnblogs.com/chy-2003/p/11242145.html