1. 程式人生 > 其它 >POJ3041 小行星 (二分圖匹配模板)

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; }