题意:在一个NxN的正方形有一些外星人基地,问最少需要放多少个武器才能消灭所有的基地,每个武器只能对单独的某行或某列有效果,但是不能同时有效果。
将行和列分别看成是两边的匹配点,转化成求最少的顶点数使所有的边都被覆盖。
需要了解一个定理:König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数。
再转化成求二分图的最大匹配数,用匈牙利算法解决
匈牙利算法:通过DFS依次对某一边的每个顶点找增广路。
Map数组记录边,Vis记录在单次增广中是否已经访问,Ma数组记录匹配边。
#include<stdio.h>
#include<string.h>
int Map[501][501];
int Vis[501],Ma[501];
int N,K;
int Find(int V){
int W;
for(W=1;W<=N;W++){
if(Map[V][W]&&!Vis[W]){
Vis[W]=1;
if(!Ma[W]||Find(Ma[W])){
Ma[W]=V;
return 1;
}
}
}
return 0;
}
int Match(){
int V,Ans=0;
for(V=1;V<=N;V++){
memset(Vis,0,sizeof(Vis));
if(Find(V))
Ans++;
}
return Ans;
}
int main(){
int V,W;
int i,j;
while(~scanf("%d %d",&N,&K)){
memset(Map,0,sizeof(Map));
memset(Ma,0,sizeof(Ma));
for(i=1;i<=K;i++){
scanf("%d %d",&V,&W);
Map[V][W]=1;
}
printf("%d\n",Match());
}
return 0;
}