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

解题思路:

枚举棋盘上所有格子,如果讲该点删除后,最大匹配数会减少,则该点为关键点。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 100 + 10;
int G[MAXN][MAXN];
int vis[MAXN];
int match[MAXN];
int n, m, k;
int path(int u)
{
    for(int v=1;v<=m;v++)
    {
        if(G[u][v] && !vis[v])
        {
            vis[v] = 1;
            if(match[v] == -1 || path(match[v]))
            {
                match[v] = u;
                return 1;
            }
        }
    }
    return 0;
}
int MaxMatch()
{
    int res = 0;
    memset(match, -1, sizeof(match));
    for(int i=1;i<=n;i++)
    {
        memset(vis, 0, sizeof(vis));
        if(path(i)) res++;
    }
    return res;
}
int main()
{
    int kcase = 1;
    while(scanf("%d%d%d", &n, &m, &k)!=EOF)
    {
        int x, y;
        memset(G, 0, sizeof(G));
        for(int i=1;i<=k;i++)
        {
            scanf("%d%d", &x, &y);
            G[x][y] = 1;
        }
        int ans = 0;
        int acc = MaxMatch();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(G[i][j])
                {
                    G[i][j] = 0;
                    if(acc > MaxMatch())
                        ans++;
                    G[i][j] = 1;
                }
            }
        }
        printf("Board %d have %d important blanks for %d chessmen.\n", kcase++, ans, acc);
    }
    return 0;
}
时间: 2024-09-29 03:36:58

HDU 1281 棋盘游戏(二分图匹配)的相关文章

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

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

HDU 1281 棋盘游戏 行列匹配

题目来源:HDU 1281 棋盘游戏 题意:有一些点可以放车 放的时候不能相互攻击到 求出哪一些点必须放 不放就不能得到最大的匹配 思路:行列匹配 矩阵的每一个点对于二分图的每一条边 首先求出最大匹配ans 然后如果每次去掉一个点然后再重新求最大匹配 很耗时 可以把第一次二分匹配的图存着 然后那些关键点肯定是是匹配的边 枚举去掉那一个格点(就是去掉一条已经匹配边)如果还能匹配 那么该格点就不是关键点 关键就是不要每次重新再求最大匹配 #include <cstdio> #include <

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

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

D - 棋盘游戏 - HDU 1281(二分图匹配)

分析:先求出来最大匹配数,然后用匹配的点一个一个去除看看能否达到最大匹配,能的话就是关键点(很暴力啊),不过竟然才31ms ***************************************************************** #include<stdio.h>#include<string.h>#include<algorithm>using namespace std; const int MAXN = 105; bool G[MAXN]

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

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

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

//是象棋里的车 符合二分匹配 # include<stdio.h> # include<algorithm> # include<string.h> using namespace std; int n,m,pp[110][110],map[110],vis[110]; int bfs(int x) { for(int i=1;i<=m;i++) { if(!vis[i]&&pp[x][i]) { vis[i]=1; if(!map[i]||bf

MZL&#39;s City (hdu 5352 最小费用流 ||二分图匹配)

MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 719    Accepted Submission(s): 251 Problem Description MZL is an active girl who has her own country. Her big country has N cities num

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): 2905    Accepted Submission(s): 1702 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽

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

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