Algorithm 二分匹配 最大的匹配数 (简单)

其实像这个求最大的匹配数的代码还是蛮简单的, 如果你会网络流那么理解起来更加方便了,不懂也没事,你可以自己画一张简单的图,把下面的过程模拟一遍 ,就知道是怎么求找了。下面的代码给出了详细的解释。

#include
#include
using namespace std ;
#define MAXN 100

bool visit[MAXN] ;//这个数组的目的 是来标记那些点已经被访问过了。
int map[MAXN][MAXN] ; //用来记录左右两边两个点的的关系。
int linker[MAXN] ;//用来放那些点已经被连接了 。

int n , m , T ;//分别表示左边与右边的点的数量

void init(){
    //初始化
    memset(map , 0 , sizeof(map)) ;
    memset(linker , -1 ,sizeof(linker)) ;

    scanf("%d%d%d" , &n, &m ,&T) ;
    //输入那些点是有联系的
    while(T--){
        int x , y ;
        scanf("%d%d" ,&x , &y ) ;
        map[x][y] = 1 ;
    }

}
int DfsFind( int x ) {

    int i ;
    for(i = 1 ; i <= m ;i++){
    
        if(map[x][i] && !visit[i]){
        
            visit[i] = true ;
            //DfsFind(linker[i]) 这是寻找某点是否有多条边连接,且构成了增广路 。
            if(linker[i] == -1 || DfsFind(linker[i]) ){
            
                linker[i] = x ;
                return true ;

            }

        }

    }
    return false ;
}
int main(){

    init () ;
    int i ,cot = 0;
    for(i = 1 ;i <= n ; i++)
    {
        memset(visit , 0 ,sizeof(visit)) ;//这里要注意 visit 每次都要初始化的
        if(DfsFind(i))
            cot++ ;        
    }
    printf("%d\n" , cot ) ;

    return 0 ;
}



你可能感兴趣的:(ACM)