ハンガリーアルゴリズム-ダンサーを探す


詳細

#include 
#include 
using namespace std;
const int MAXN = 100;
int uN, vN;            // u,v  ,u     ,v     
bool g[MAXN][MAXN];        // g[i][j]    xi yj  ,           
int xM[MAXN], yM[MAXN];       //      ,          ,-1         
bool chk[MAXN];       //          y[v]   check 
bool SearchPath(int u){      
	int v;      
	for(v = 0; v < vN; v++) {          
		if(g[u][v] && !chk[v]){    //            ,             (chk[v]               ,    ,               )         
			chk[v] = true;              
			if(yM[v] == -1 || SearchPath(yM[v]))  //              ,                     (        )             
			{                 
				yM[v] = u;                        //            
				xM[u] = v;                        //           
				return true ;					  //            ,  
			}         
		}     
	}     
	return false ;								//     ,          
}
int MaxMatch(){      
	int u;      
	int ret = 0 ;      
	memset(xM, -1, sizeof (xM));      
	memset(yM, -1, sizeof (yM));      
	for(u = 0; u < uN; u++)      
	{          
		if(xM[u] == -1)							//-1           
		{              
			memset(chk, false, sizeof (chk));   //                       
			if(SearchPath(u)) ret++;			//     
		}     
	}     
	return ret;
}