您的位置:首页 > 其它

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

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

<span style="font-size:18px;">#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 ;
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: