这题需要转换成最小点覆盖,再等同于寻找二分图最大匹配。
思路的转换是难点,匈牙利算法本身比较直白简洁。
所有行号作为V1点集,列号作为V2点集。障碍物看做链接V1和V2的边。
#include <iostream>
#include <string.h>
using namespace std;
int N,K;
bool visit[501];
bool graph[501][501];
int link[501];
bool find(int i){
for(int j = 1;j<=N;++j){
if(graph[i][j] && !visit[j]){
visit[j] = 1;
if(link[j]==0 || find(link[j])){
link[j] = i;
return true;
}
}
}
return false;
}
int main(){
cin>>N>>K;
int x,y;
for(int i=1;i<=K;++i){
cin>>x>>y;
graph[x][y] = true;
}
int m = 0;
for(int i=1;i<=N;++i){
memset(visit,0,sizeof(visit));
if(find(i))
++m;
}
cout<<m<<endl;
}