您的位置:首页 > 大数据 > 人工智能

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

2015-03-22 21:20 190 查看
这是一题水水的题, 这题用了匈牙利算法,求二分图的最大匹配数, 然后用点数去减, 便是答案。
我自己在理解匈牙利算法的时候想了一个小比喻,便是: 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: