POJ3041 小行星 (二分图匹配模板)

学了这么久连模板都没有写过,我来补个坑......

将行看成集合X,列看成Y,障碍看成是X到Y的一条边。

消除次数最少,等价于最小点覆盖问题,最小点覆盖=最大匹配数,跑一遍匈牙利就行了

#include<bits/stdc++.h>
using namespace std;
int n,k;
int V1,V2;
bool m[501][501],vis[501];
int link[501],ans;
 
bool dfs(int x){//匈牙利算法 
    for(int y=1;y<=V2;y++)
        if(m[x][y]&&!vis[y]){
            vis[y]=true;
            if(!link[y]||dfs(link[y])){
                link[y]=x;
                return true;
            }
        }
        return false;
}
 
void search(){
    for(int x=1;x<=V1;x++){
        memset(vis,false,sizeof(vis));//将上一次搜索时的标记清空 
        if(dfs(x)) ans++;
    }
    return ;
}
 
int main(){
    cin>>n>>k;
    V1=V2=n;
    for(int i=1;i<=k;i++){
        int x,y;
        cin>>x>>y;
        m[x][y]=true;
    }
    search();
    cout<<ans<<endl;
}

 

posted @ 2022-04-04 14:29  YHXo  阅读(16)  评论(0编辑  收藏  举报