思路:
根据题意,当在某一点放置车后,该行和该列都不能再放置。所以对行和列建边求最大匹配即可。
代码:
#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; }