POJ3041 小行星 (二分圖匹配模板)
阿新 • • 發佈:2022-04-04
學了這麼久連模板都沒有寫過,我來補個坑......
將行看成集合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; }