首页 > 其他分享 >hdu棋盘游戏(二分图匹配)

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

时间:2022-12-01 23:34:35浏览次数:68  
标签:二分 hdu include 格子 Gardon int grid 110 棋盘

题目描述

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

Input
输入包含多组数据,
第一行有三个数N、M、K(1<N,M<=100 1<K<=N*M),表示了棋盘的高、宽,以及可以放“车”的格子数目。接下来的K行描述了所有格子的信息:每行两个数X和Y,表示了这个格子在棋盘中的位置。

Output
对输入的每组数据,按照如下格式输出:
Board T have C important blanks for L chessmen.


输入样例

3 3 4
1 2
1 3
2 1
2 2
3 3 4
1 2
1 3
2 1
3 2
 

输出样例

Board 1 have 0 important blanks for 2 chessmen.
Board 2 have 3 important blanks for 3 chessmen.

本题的难点在二分图转化:
一个车相当于连接了一个行点和一个列点,寻找重要点及删去一个边后最大匹配数减小
附ac代码
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, m;
bool grid[110][110], used[110];
int linker[110];
bool dfs(int u)
{
    for (int i = 1; i <= m; ++i)
    {
        if(grid[u][i]&&!used[i])
        {
            used[i] = 1;
            if (linker[i] == -1 || dfs(linker[i]))
            {
                linker[i] = u;
                return 1;
            }
        }
    }
    return 0;
}
int pipei()
{
    int res=0;
    memset(linker,-1,sizeof(linker));
    for(int i=1;i<=n;++i)
    {
        memset(used,0,sizeof(used));
        if(dfs(i)) 
        {
        res++;
        }
    }
    return res;
}
int main()
{
    int k, imp , maxn , ans ;
    int t = 0,u,v;
    while (scanf("%d%d%d", &n, &m, &k) == 3)
    {
        imp = 0;
        memset(grid, 0, sizeof(grid));
//sizeof(grid)而不是sizeof(0),小心别打错了 for (int i = 0; i < k; ++i) { scanf("%d%d", &u, &v); grid[u][v] = 1; } maxn=pipei(); //cout<<maxn; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { if(grid[i][j]) { grid[i][j]=0; ans=pipei(); grid[i][j]=1;//回溯 if(ans!=maxn) imp++; } } printf("Board %d have %d important blanks for %d chessmen.\n", ++t, imp, maxn); } return 0; }

 

 

标签:二分,hdu,include,格子,Gardon,int,grid,110,棋盘
From: https://www.cnblogs.com/ruoye123456/p/16943124.html

相关文章

  • 贪婪算法优化计算-马踏棋盘问题
    一、    问题阐述将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,要求每个方格进入且只进入一次,走遍棋盘上的64个方格,将数字1,2,3…,64依次填入一......
  • 算法之二分查找
    1.二分查找:指的是通过找到中间值,用中间值和需要找的值作比较,在中间值的左右区间来判断需要寻找的值所在的位置。"""coding:utf-8@Software:PyCharm@Time:2022/12/116......
  • 二分图判定
    二分图的判定二分图的定义:若无向图\(G\)的所有节点可以划分为两个集合\(A,B\),若\(A,B\)均不为空且不存在一条边\((u,v)\)使得\(u,v\)属于同一集合,则称这个无向图为二分图......
  • wqs 二分
    更应该说是一种思想吧。我们希望知道恰好选择\(k\)个物品时的答案,但世界上哪来的那么多恰好呢。令\(f_x\)是恰好选择\(k\)个物品时的答案,那么点集\((x,f_x)\)常会......
  • 双栈排序——二分图+模拟
    二分图建模-双栈排序题目描述Tom最近在研究一个有趣的排序问题。如图所示,通过\(2\)个栈\(S_1\)和\(S_2\),Tom希望借助以下\(4\)种操作实现将输入序列升序排序。......
  • 洛谷 P1387 最大正方形(前缀和,二分)
    题目分析当一个边长为x的正方形不包含0时,这个正方形内的二维前缀和为x*x,题目想求满足条件的最大的正方形的边长假如最大的正方形的边长为ans,那么凡是边长大于ans的正方形......
  • 二分浅入
    二分前言仅看要点不是很能理解,主要是看示例要点总结复习用要点关注范围,需要的是\([left,right]\)还是\([left,right)\)定义最后\(l\)和\(r\)落点位置是什么根......
  • hdu 5418 Victor and World
    hdu5418VictorandWorldTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:262144/131072K(Java/Others)链接:http://acm.hdu.edu.cn/showproblem.php?pi......
  • QQ连连看棋盘数组找法:
    QQ连连看棋盘数组找法:1.  附加CE  2.  内存扫描选项----选择全部,数值类型:为字节(byte)3.  索定棋盘左上角第一个格子  搜索大......
  • 372. 棋盘覆盖
    题目链接372.棋盘覆盖给定一个\(N\)行\(N\)列的棋盘,已知某些格子禁止放置。求最多能往棋盘上放多少块的长度为\(2\)、宽度为\(1\)的骨牌,骨牌的边界与格线重合(骨......