匹配的一些概念:
完美匹配、完备匹配、最佳匹配
交错轨
可增广轨
匈牙利算法原理:从当前匹配M出发,检查每个未盖点,然后从它出发寻找可增广路,找到可增广路,沿着增广路扩充,直到找不到这样的路停止。
JOJ 2730
题意:http://blog.csdn.net/jxy859/article/details/6747413
邻接阵
#include <cstdio>
#include <cstring>
const int N=105;
const int M=105;
bool map[N][M];
//X Y
int match[M];
//Y中与X的哪个匹配,初始为N,表示没有匹配
int vis[N];
//表示X中的元素在dfs过程中是否被标记过
int n,m;
bool dfs (int u)
{
for (int i=0 ; i<n ; ++i)
if(map[u][i] && !vis[i])
{
vis[i]=true;
if(match[i]==-1 || dfs(match[i]))
{
match[i]=u;
return true;
}
}
return false;
}
int Maxmatch()
{
int res=0;
memset (match , -1 , sizeof(match));
for (int i=0 ; i<n ; ++i)
{
memset (vis , false , sizeof(vis));
if(dfs(i))res++;
}
return res++;
}
int k;
int sc[105][30];
bool valid (int x, int y)
{
for (int i=0 ; i<k ; ++i)
if(sc[x][i]>=sc[y][i])
return false ;
return true;
}
void build_graph()
{
memset (map , false , sizeof(map));
for (int i=0 ; i<n ; ++i)
{