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

题目链接:

  Hdu 1281 棋盘游戏

题目描述:

  题目汉语,只说一点,国际象棋中车的攻击范围就像n皇后问题中的皇后一样,同行和同列的车都会相互攻击。

解题思路:

  求出来的最大匹配数目==最多能放几个车。计算有几个格子是重要点的时候只需要算出最大的匹配数目,然后枚举每个点不能放置棋子时候的最大匹配数目。最大匹配数目小于原匹配数目的时候,当前枚举点就是重要点。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int maxn = 110;
 8 int maps[maxn][maxn], ans[maxn], n, m, k;
 9 int used[maxn], vis[maxn], p[2][maxn*maxn];
10
11 bool Find (int x)
12 {//匈牙利算法
13     for (int i=1; i<=m; i++)
14     {
15         if (!vis[i] && maps[x][i])
16         {
17             vis[i] = 1;
18             if (!used[i] || Find(used[i]))
19             {
20                 used[i] = x;
21                 return true;
22             }
23         }
24     }
25     return false;
26 }
27 int main ()
28 {
29     int l = 0;
30     while (scanf ("%d %d %d", &n, &m, &k) != EOF)
31     {
32         p[0][0] = p[1][0] = 0;
33         p[0][k+1] = p[1][k+1] = 0;
34         memset (maps, 0, sizeof(maps));
35         for (int i=1; i<=k; i++)
36         {
37             scanf ("%d %d", &p[0][i], &p[1][i]);
38             maps[p[0][i]][p[1][i]] = 1;
39         }
40         memset (ans, 0, sizeof(ans));
41         int Max = 0;
42         for (int i=1; i<=k+1; i++)
43         {//枚举可放置棋子的点
44             maps[p[0][i-1]][p[1][i-1]] = 1;
45             maps[p[0][i]][p[1][i]] = 0;
46             int res = 0;
47             memset (used, 0, sizeof(used));
48             for (int j=1; j<=n; j++)
49             {
50                 memset (vis, 0, sizeof(vis));
51                 if (Find(j))
52                     res ++;
53             }
54             ans[res] ++;
55             if (res > Max)
56                 Max = res;
57         }
58         printf ("Board %d have %d important blanks for %d chessmen.\n", ++l, k - ans[Max] + 1, Max);
59     }
60     return 0;
61 }
时间: 2024-08-07 20:19:14

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

HDU 1281 棋盘游戏 行列匹配

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

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 棋盘游戏(二分图匹配)

解题思路: 枚举棋盘上所有格子,如果讲该点删除后,最大匹配数会减少,则该点为关键点. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <algorithm> using namespace std; const int MAXN = 100 + 10; int G[MAXN][M

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

Hdu 1045 二分匹配

题目链接 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6282    Accepted Submission(s): 3551 Problem Description Suppose that we have a square city with straight streets. A map of a city i

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

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

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 棋盘游戏 (2分匹配)

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