【算法竞赛进阶指南】車的放置(行列模型二分图最大匹配+匈牙利算法)

原题链接
思路:
根据题意,当在某一点放置车后,该行和该列都不能再放置。所以对行和列建边求最大匹配即可。
代码:

#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;
}
posted @ 2020-10-20 00:31  OvO1  阅读(65)  评论(0编辑  收藏  举报