zoukankan      html  css  js  c++  java
  • 「SCOI2015」小凸玩矩阵

    题目链接

    问题分析

    题目给了充足的暗示,我们只需要二分答案然后跑匈牙利即可。要相信匈牙利的速度

    参考程序

    #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
    ", Ans );
    	return 0;
    }
    
    
  • 相关阅读:
    C# AtomicInt
    Ubuntu16.04或18.04上安装QQ微信迅雷
    Git强制拉取覆盖本地 Pull force
    ulimit限制打开的文件数量
    centos 7.x设置守护进程的文件数量限制
    Apache Doris通过supervisor进行进程管理
    CentOS7 安装supervisor守护进程管理器
    fdisk 分区
    linux i2c tools
    ubuntu12.04 登录黑屏
  • 原文地址:https://www.cnblogs.com/chy-2003/p/11242145.html
Copyright © 2011-2022 走看看