【算法竞赛进阶指南】車的放置(行列模型二分图最大匹配+匈牙利算法)
原题链接
思路:
根据题意,当在某一点放置车后,该行和该列都不能再放置。所以对行和列建边求最大匹配即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=210;
int g[maxn][maxn];///表示禁止放置
int n,m,t;
bool st[maxn];
int mat[maxn];
bool Find(int x){
for(int i=1;i<=m;i++){
if(!g[x][i]&&!st[i]){
st[i]=1;
if(!mat[i]||Find(mat[i])){
mat[i]=x;
return 1;
}
}
}
return 0;
}
int main(){
cin>>n>>m>>t;
for(int i=1;i<=t;i++){
int x,y;
cin>>x>>y;
g[x][y]=1;
}
int res=0;
for(int i=1;i<=n;i++){
memset(st,0,sizeof st);
if(Find(i)) res++;
}
cout<<res<<endl;
return 0;
}