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