POJ 1422 Air Raid 及 关于匈牙利算法的理解的小比喻

22 篇文章 0 订阅
   这是一题水水的题, 这题用了匈牙利算法,求二分图的最大匹配数, 然后用点数去减, 便是答案。
   我自己在理解匈牙利算法的时候想了一个小比喻,便是: A 发现了一个符合他的座位, 但是发现B坐在上面, 于是便对B说, “B 啊, 你还有没有其他的座位可以坐啊, 有的话你去坐那个座位吧。” 然后B往后找其他座位, 找到了一个符合的座位, 发现C坐在上面, 于是便对C说:“ C 啊,你还有没有其他的座位可以坐啊, 有的话你去坐那个座位吧。”然后C也往后找其他的符合条件的座位。。。。。。  最后到了F,F 找到了一个符合的座位, 便打电话给E, E便坐在F原先的位置上, 又打电话给D。。。 。。。最后大家都找到了座位 。怎么样? 形象不形象~~  哈哈 , 我觉得还可以~~
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define mem(a) memset(a, 0, sizeof(a))
using namespace std;

bool vis[125], map[125][125];
int lk[125], n;

bool dfs(int a)
{
	int i;
	for(i = 1;i <= n;i++)
	{
		if(!vis[i]&&map[a][i])
		{
			vis[i] = 1;
			if(lk[i] == -1||dfs(lk[i]))
			{
				lk[i] = a;
				return true;
			}
		}
	}
	return false;
}

int main(int argc, char *argv[])
{
    int i, j, k, t, m, res;
	scanf("%d",&t);
	while(t--)
	{
		res = 0;
		mem(vis);
		mem(map);
		memset(lk, -1, sizeof(lk));
		scanf("%d%d",&n, &m);
		for(i = 0;i < m;i++)
		{
			scanf("%d%d",&j, &k);
			map[j][k] = 1;
		}
		for(i = 1;i <= n;i++)
		{
			mem(vis);
			if(dfs(i))
			res++;
		}
		printf("%d\n", n - res);
	}	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值