hdu1281---棋盘游戏

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

以每一个可以放车的点的行列坐标为点,建图,然后求最大匹配
接下来,删边,观察最大匹配是否改变,如果改变,这个点就是关键点

/*************************************************************************
    > File Name: hdu1281.cpp
    > Author: ALex
    > Mail: zchao1995@gmail.com 
    > Created Time: 2015年02月16日 星期一 18时01分44秒
 ************************************************************************/

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;

const int N = 110;
int edge[N][N];
int un, vn, n, m;
int match[N];
bool used[N];
struct node
{
    int x, y;
}imp[N * N];

bool dfs (int u)
{
    for (int i = 1; i <= vn; ++i)
    {
        if (edge[u][i] && !used[i])
        {
            used[i] = 1;
            if (match[i] == -1 || dfs (match[i]))
            {
                match[i] = u;
                return 1;
            }
        }
    }
    return 0;
}

int hungry ()
{
    memset (match, -1, sizeof(match));
    int ans = 0;
    for (int i = 1; i <= un; ++i)
    {
        memset (used, 0, sizeof(used));
        if (dfs(i))
        {
            ++ans;
        }
    }
    return ans;
}

int main ()
{
    int k;
    int icase = 1;
    while (~scanf("%d%d%d", &n, &m, &k))
    {
        memset (edge, 0, sizeof(edge));
        for (int i = 1; i <= k; ++i)
        {
            scanf("%d%d", &imp[i].x, &imp[i].y);
            edge[imp[i].x][imp[i].y] = 1;
        }
        un = n;
        vn = m;
        int ans = hungry();
        int ret = 0;
        for (int i = 1; i <= k; ++i)
        {
            edge[imp[i].x][imp[i].y] = 0;
            if (hungry() != ans)
            {
                ++ret;
            }
            edge[imp[i].x][imp[i].y] = 1;
        }
        printf("Board %d have %d important blanks for %d chessmen.\n", icase++, ret, ans);
    }
    return 0;
}
棋盘游戏 二分匹配 棋盘游戏 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。  所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些... 阅读详情

相关推荐

ACM HDU 1281 棋盘游戏 (二分匹配,方格的建图,找关键点)

棋盘游戏 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 5   Accepted Submission(s) : 4 Font: Times New Roman | Verdana | Georgia Font Size: ← → ...

weixin_34384557的博客 561

HDU - 1281 棋盘游戏(最大匹配)

小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也...

LSC__lsc的博客 414

HDU1281棋盘游戏-最大二分匹配

棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4501    Accepted Submission(s): 2668 Problem Description 小希和Gardon在玩一个游戏:对一个N*

Code-Dreamer的博客 648

hdu 1281 棋盘游戏(二分图匹配)

hdu 1281 棋盘游戏Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有

总有那么一群人喜欢盯着我的博客看,估计这是他们见过最长的博客名,我必须得告诉他们博客名最长可以写多长 682

Hdu 1281 棋盘游戏

Hdu 1281 棋盘游戏(二分图匹配) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description: 小希和Gardon在玩一个游戏:对一个NM的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见...

weixin_43823753的博客 501

Hdu 1281 棋盘游戏 (二分匹配)

题目链接:   Hdu 1281 棋盘游戏 题目描述:   题目汉语,只说一点,国际象棋中车的攻击范围就像n皇后问题中的皇后一样,同行和同列的车都会相互攻击。 解题思路:   求出来的最大匹配数目==最多能放几个车。计算有几个格子是重要点的时候只需要算出最大的匹配数目,然后枚举每个点不能放置棋子时候的最大匹配数目。最大匹配数目小于原匹配数目的时候,当前枚举点就是重要点。 1 #i...

weixin_30553065的博客 136

hdu1281 棋盘游戏

这题也是简单的模板应用,但是有一点不一样; 重要点:如果取消这个点,不能放置尽量多的棋子,比如原来可以放3个,如果不放这个只能放2个,说明它是一个重要点; 这题的解题思路就是:先算出最大匹配数,然后把读入的可放置点的坐标依次取消标记,再算一次最大匹配,如果两次匹配结果相等,说明其不是重要点,记录数加1,算完要记得还原标记; 最后计算出来的时候记得用最大棋子数减掉记录数; 下面附上...

diehuantuo8942的博客 223

HDU 1281 棋盘游戏

HDU 1281 二分图 题意 给你几个格子 问你像中国象棋一样放车能放几个 根据lyd说的0要素和1要素 我们把行和列直接建边 因为放了一个 就行和列都饱和 也就是1元素 然后行的点在左边 列的点在右边 也就是0元素 然后要检查一个非重要点 只要枚举这个点不建边 看是否最大匹配数少于所有边的最大匹配数 如果少于 则是非重要点 /* if you can't see the r...

我是谁 --- 卡比兽 193

hdu 1281 棋盘游戏

http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3096Accepted Submission(s): 1...

deyou1988的专栏 122

HDU1281-棋盘游戏

棋盘游戏                                                                              Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                              

wang_128的博客 690

HDU1281 棋盘游戏

棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5490    Accepted Submission(s): 3235 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘

zezzezzez的博客 387

棋盘游戏 HDU - 1281

小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gard

lymww的博客 270

Hdu_1281 棋盘游戏 -必须边

题意:在给定位置的棋盘下放最多的车,但它们不互相攻击,再稳有多少个位置是必须放车才会使结果最优。 /************************************************ Author :DarkTong Created Time :2016/8/1 11:39:01 File Name :hdu_1281.c...

bannesi6888的博客 127

Hdu1281 棋盘游戏

棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4808    Accepted Submission(s): 2848 Problem Description 小希和Gardon在玩一个游戏:对一个N*

Jelly_acm的博客 514

hdu 1281 棋盘游戏(二分图)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 每行每列作为节点,给可以放车的点将对应的行列连边,最多可放置的车即为建二分图后的最大匹配,跑一边匈牙利算法即可。 第二问重要的棋盘点(其实就是问某个可以放置车的点被删除之后,会不会影响最终放置车的数量),也就是会不会影响二分图的最大匹配数,其实就是删除这个点对应行列连接的边,如果二分图最大匹...

qq_41949535的博客 181
上一篇: hdu1045---Fire Net
下一篇: hdu1238---Substrings
tokers
博客等级 码龄12年 71粉丝 700原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值