图论:二分图最大匹配(匈牙利算法)
邻接矩阵:
点击查看折叠代码块
int n,m;//V1中的点数,V2中的点数
bool used[MAXN];
int line[MAXN][MAXN];//line != 0 表示存在这条边
int girl[MAXN];
bool find(int x){//递归过程
for (int j=1;j<=m;j++){
if(line[x][j] && !used[j]){
used[j]=1;
if(girl[j]==0 || find(girl[j])){
girl[j]=x;
return true;
}
}
}
return false;
}
int ans=0;//匹配数
void MATCH(){//求最大匹配
for (int i=1;i<=n;i++){
memset(used,0,sizeof(used));
if(find(i)) ans++;
}
}
前向星:
点击查看代码块
int head[maxn],cnt = 0;
struct edge{
int u,v,next;
}e[maxn<<2];
bool vis[maxn];
int mh[maxn];
int solve(int x){
for (int i=head[x];~i;i=e[i].next){
int v=e[i].v;
if(!vis[v]){
vis[v] = 1;
if(mh[v] == 0 || solve(mh[v])){
mh[v] = x;
return 1;
}
}
}
return 0;
}
int match(int n){
int ans = 0;
for (int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
ans += solve(i);
}
return ans;
}