POJ3041 二分图匹配

题意:在一个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;
} 


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值