棋盘游戏---hdu1281(最大匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281

题目大意:就是车和车之间不能发生攻击.还有一部分位置不可以放置棋子。

解题思路:一行一列只能放一个,那么对于横纵坐标x和y来说一行一列只有一个交点。所以我们就可以根据X坐标与Y坐标把这些点转换为二分图。

对于重要点问题,我们就可以把这个点去掉,涂黑不让他走,然后在进行一次二分匹配,如果发现最大匹配值小了,那么这个就是重要点。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 110

int maps[N][N], vis[N], used[N], n, m, k, ans, ans0;
struct node
{
    int x,y;
}a[N*N];///注意k的取值范围,wa了一次;
bool Find(int u)
{
    for(int i=1; i<=m; i++)
    {
        if(!vis[i] && maps[u][i])
        {
            vis[i] = 1;
            if(!used[i] || Find(used[i]))
            {
                used[i] = u;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    int t = 1, x, y;
    while(scanf("%d%d%d", &n, &m, &k)!=EOF)
    {
        ans = ans0 = 0;
        memset(used, 0, sizeof(used));
        memset(maps, 0, sizeof(maps));
        for(int i=1; i<=k; i++)
        {
            scanf("%d%d", &x, &y);
            a[i].x = x;
            a[i].y = y;
            maps[x][y] = 1;
        }
        for(int i=1; i<=n; i++)
        {
            memset(vis, 0, sizeof(vis));
            if(Find(i))
                ans++;
        }
        for(int i=1; i<=k; i++)
        {
            int kk=0;
            memset(used, 0, sizeof(used));
            x=a[i].x;
            y=a[i].y;
            maps[x][y] = 0;
            for(int j=1; j<=n; j++)
            {
                memset(vis, 0, sizeof(vis));
                if(Find(j))
                    kk++;
            }
            if(kk<ans)
                ans0++;
            maps[x][y] = 1;
        }
        printf("Board %d have %d important blanks for %d chessmen.\n", t++, ans0, ans);
    }
    return 0;
}

时间: 2024-11-10 07:12:11

棋盘游戏---hdu1281(最大匹配)的相关文章

HDU 1281——棋盘游戏——————【最大匹配、枚举删点、邻接表方式】

棋盘游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1281 Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的

HDU ACM 1281 棋盘游戏-&gt;二分图最大匹配(匈牙利算法实践)

分析:该題可以用x坐标去匹配y坐标,匹配成功一次就是一个可放棋子的点,最后求得的的二分图最大匹配就是可以放的最大棋子数.求二分图的最大匹配使用匈牙利算法.之后通过删除一条边来判断一个点是否为关键点,若删边后,最大匹配数不变则不是,否则是,通过分别删除每个点进行测试,最终即可算出关键点的个数. #include<iostream> using namespace std; #define N 102 int map[N][N]; //记录连接x和y的边 bool vis[N]; //记录y中节点

专题之匹配、网络流(一)

1.hdu 2444 The Accomodation of Students(判断二分图+最大匹配)(匈牙利模板) 题意:一共有n个学生,m对关系:A认识B.问能否将所有的人分成两批,每批之间的人都互相认识,如果可以,输出每批的人数.即判断是否为二分图,以及求二分图的最大匹配. 思路:判断是否为二分图(DFS或BFS):求二分图的最大匹配:匈牙利算法. 1 #include<iostream> 2 #include<queue> 3 using namespace std; 4

hdu1281 棋盘游戏 --- 最大匹配

给一个矩形棋盘,上面有一些空格点,能够放象棋中的"车", 现给出空格的坐标,求最多能够放多少个"车"使他们互不攻击(依据象棋规则,每行每列至多仅仅能放一个), 还要求有几个"车"是必须选择的. 由于每行每列仅仅能放一个.所以不能有冲突的x或y坐标.既把x和y分为二分图的两个集合.要求最大匹配. 至于有多少个必须选择的.我们能够枚举最大匹配中的每一个匹配,(一个匹配相当于一个坐标嘛),去掉该匹配之后再求一边最大匹配比較就可以. 这里我为了方便写.直

hdu------1281 棋盘游戏(最小覆盖点)

棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2492    Accepted Submission(s): 1452 Problem Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是 Gardon限制了只有某

二分图最大匹配 (hdu1281、1528)

(hdu1281)棋盘游戏 题意:棋盘中一些格子可以放棋子,但要求棋子不能同行也不能同列.有一些格子若不放棋子,则最大匹配数目减少,则这个格子就是"重要点". 二分图的匹配:给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配. #include"stdio.h" #include"string.h" #include"stdlib.h" #include"algo

hdu1281棋盘游戏(二分匹配,最小顶点覆盖)

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

hdu-1281.棋盘游戏(二分图匹配 + 二分图关键点查询)

棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7898    Accepted Submission(s): 4600 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格

hdu1281+hdu2819(最大匹配数)

分析:将行和列缩点,即行对应二分图的X部,列对应二分图的Y部,然后交点为连接该行和该列的一条边.匹配时每点都会把整行整列占了,因此就不会出现冲突了. 传送门:hdu1281 棋盘游戏 #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <q