HDU 3360 National Treasures 奇偶匹配的最低点覆盖

标题来源:

pid=3360">HDU 3360 National Treasures

意甲冠军:假设a[i][j] != -1 把他转成二进制 最多有12位 代表题目那张图的12个位置 假设相应位是1 说明在那里放一个守卫能够看住a[i][j]位置上的这个东西

思路:明显死最小点覆盖 奇偶匹配建图

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 55;
int vis[maxn*maxn];
int y[maxn*maxn];
vector <int> G[maxn*maxn];
int n, m;
int a[maxn][maxn];
int dir[12][2] = {-1, -2, -2, -1, -2, 1, -1, 2, 1, 2, 2, 1, 2, -1, 1, -2, -1, 0, 0, 1, 1, 0, 0, -1};
bool dfs(int u)
{
    for(int i = 0; i < G[u].size(); i++)
    {
        int v = G[u][i];
        if(vis[v])
            continue;
        vis[v] = true;
        if(y[v] == -1 || dfs(y[v]))
        {
            y[v] = u;
            return true;
        }
    }
    return false;
}
int match()
{
    int ans = 0;
    memset(y, -1, sizeof(y));
    for(int i = 0; i < n; i++)
    {
    	for(int j = 0; j < m; j++)
        {
        	if((i+j)%2)
			{
				memset(vis, 0, sizeof(vis));
        		if(dfs(i*m+j))
        		    ans++;
			}
        }
    }
    return ans;
}

int main()
{
	int cas = 1;
	while(scanf("%d %d", &n, &m) && (n||m))
	{
		for(int i = 0; i < n; i++)
			for(int j = 0; j < m; j++)
				scanf("%d", &a[i][j]);
		for(int i = 0; i < n*m; i++)
			G[i].clear();
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < m; j++)
			{
				int x = a[i][j];
				if(x == -1)
					continue;
				for(int k = 0; k < 12; k++, x >>= 1)
				{
					if(!x)
						break;
					if(!(x&1))
						continue;

					int xx = i + dir[k][0];
					int yy = j + dir[k][1];
					if(xx < 0 || xx >= n || yy < 0 || yy >= m)
						continue;
					if(a[xx][yy] == -1)
						continue;
					if((i+j)%2)
						G[i*m+j].push_back(xx*m+yy);
					else
						G[xx*m+yy].push_back(i*m+j);
				}
			}
		}
		printf("%d. %d\n", cas++, match());
	}
    return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-10-29 19:53:25

HDU 3360 National Treasures 奇偶匹配的最低点覆盖的相关文章

HDU 3360 National Treasures 奇偶匹配最小点覆盖

题目来源:HDU 3360 National Treasures 题意:如果a[i][j] != -1 把他转成二进制 最多有12位 代表题目那张图的12个位置 如果对应位是1 说明在那里放一个守卫可以看住a[i][j]位置上的这个东西 思路:明显死最小点覆盖 奇偶匹配建图 #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 55; in

HDU 3360 National Treasures

National Treasures Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 3   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description The great hall of th

HDU 3360-National Treasures(最小点覆盖+奇偶匹配)

/******************************************************* 题意: 现在有一个n*m的博物馆g,每一个g[i][j]要不是一个<=2^12 的数,要不就是-1. 如果这个点是-1,表示这个点有一个守卫 否则就是以g[i][j]为关键字规则的宝物. 具体规则是: 现在有12个被编号的点(题目中给出了图片),然后把g[i][j]表示成一个12位二进制数 ,从低位到高位(右到左)依次为1~12,如果某位i上是1,就表示在编号 为i的相对位置放置一个

hdu 4185 Oil Skimming(二分匹配)

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 883    Accepted Submission(s): 374 Problem Description Thanks to a certain "green" resources company, there is a new profitable

hdu 2255 二分图带权匹配 模板题

模板+注解在 http://blog.csdn.net/u011026968/article/details/38276945 hdu 2255 代码: //KM×î´ó×îСƥÅä #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; #define INF 0x0fffffff const int MAXN

HDU 1281 棋盘游戏(二分匹配 与 删边)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 根据题目描述,什么是重要点?在求出最大匹配后,进行枚举,依次删边,看最大匹配数会不会发生改变,改变的话,那么该点就是重要点. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <

HDU 2119 Matrix 简单二分匹配

行做x集,列做y集,1就给该行该列连一条边,输出最大匹配边即可 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<set> using namespace std; #define N 105 int lef[N], pn;//lef[v]表示Y集的点v 当前连接的点 , pn为x点集的

hdu 3605 Escape (二分图多重匹配)

Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4298    Accepted Submission(s): 1129 Problem Description 2012 If this is the end of the world how to do? I do not know how. But now scient

HDU 1083 裸的二分匹配

Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3424    Accepted Submission(s): 1650 Problem Description Consider a group of N students and P courses. Each student visits zero, one or