hdu 1281 二分图匹配

题目:在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就 无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么?

二分图匹配居然还能这么用!!!脑洞大开啊!!!

思路:把棋盘的行x看成二分图左边的点,列y看成二分图右边的点,那么就把可以放车的位置看成是一条边,而二分图的最大匹配中x互不相同,y 互不相同,所以每个匹配都是不同行不同列,所以最大匹配就是最多可以放的车的数量。而要判断有多少个点是必须放的,只要在得出最大匹配后,每次去掉一个匹 配,再去运算看得出的结果是否与原来的最大匹配数相同,若相同就不是必须的,若不相同就是必须的。

Sample Input

3 3 4  //棋盘行列,可以放的位置数目
1 2    //位置坐标
1 3
2 1
2 2
3 3 4
1 2
1 3
2 1
3 2

Sample Output

Board 1 have 0 important blanks for 2 chessmen.
Board 2 have 3 important blanks for 3 chessmen.
 1 #include<iostream>
 2 #include<string.h>
 3 #include<vector>
 4 #include<cstdio>
 5 using namespace std;
 6 const int maxn = 105;
 7 int uN,vN;//u,v的数目,使用前面必须赋值
 8 int g[maxn][maxn];//邻接矩阵
 9 int linker[maxn];
10 bool used[maxn];
11 bool dfs(int u)
12 {
13     for(int v = 1; v <=vN;v++)  //注意编号
14     if(g[u][v] && !used[v])
15     {
16         used[v] = true;
17         if(linker[v] == -1 || dfs(linker[v]))
18         {
19             linker[v] = u;
20             return true;
21         }
22     }
23     return false;
24 }
25 int hungary()
26 {
27     int res = 0;
28     memset(linker,-1,sizeof(linker));
29     for(int u=1;u <=uN;u++) //注意编号
30     {
31         memset(used,false,sizeof(used));
32         if(dfs(u))res++;
33     }
34     return res;
35 }
36 int main()
37 {
38     int n;
39     int i,j,k;
40     int ccase=0;
41     freopen("1.in","r",stdin);
42     while(scanf("%d%d%d",&uN,&vN,&n)!=EOF)
43     {
44         memset(g,0,sizeof(g));
45         ccase++;
46         int cnt=0;
47         int p,q;
48         for(i=0;i<n;i++)
49         {
50             scanf("%d%d",&p,&q);
51             g[p][q]=1;
52         }
53         int ans=hungary();
54         for(i=1;i<=uN;i++)  //注意编号
55         {
56             for(j=1;j<=vN;j++)
57             {
58                 if(g[i][j]==1)
59                 {
60                     g[i][j]=0;
61                     //printf("%d %d ***%d\n",i,j,hungary()  );
62                     if(ans>hungary())   cnt++;
63                     g[i][j]=1;
64                 }
65             }
66         }
67         printf("Board %d have %d important blanks for %d chessmen.\n",ccase,cnt,ans);
68     }
69     return 0;
70 }
时间: 2024-10-14 22:26:42

hdu 1281 二分图匹配的相关文章

hdu 2063 二分图匹配

题意:一些女的和一些男的有好感,有好感的能一起坐过山车,问最多能组成多少对 hdu 11 页上少有的算法题,二分图匹配问题,匈牙利算法,对于每一个汉子,看和他有好感的妹子有没有配对了,没有配对过就可以成功配对,若已经配对过了,就看那个妹子所配对的汉子能不能再找个没有配对的妹子,如果可以就拆散当前配对重组配对,否则就不能拆:如果找完所有有好感的妹子仍然没能配对成功,那这个汉子就注定孤独一生了``` 1 #include<stdio.h> 2 #include<string.h> 3

hdu 1281 二分图残量增广

http://acm.hdu.edu.cn/showproblem.php?pid=1281 每行每列最多放置一个车,所以可以把行号和列号当成点,给定的点当成边进行最大匹配,得到的答案就是最大放置数了 然后,还要求重要点——转化为删除边后得到的最大匹配数是否发生变化的问题 易知重要点一定是模型中产生最大匹配时的边,所以我们枚举这样的边,尝试着删除判断情况 较优的做法是删边时将两个标号标记为未匹配,然后禁用这条边,在原有的基础上进行增广,若没有找到新的增广路,则重要点数+1,把两个标记复原 若找到

hdu 1281 二分图最大匹配

对N个可以放棋子的点(X1,Y1),(x2,Y2)......(Xn,Yn);我们把它竖着排看看~(当然X1可以对多个点~) X1   Y1 X2   Y2 X3   Y3 ..... Xn   Yn 可以发现:可以根据X坐标与Y坐标把这些点转换为二分图! 首先:只有左边的点与右边的点有关系 其次:符合二分图的最大匹配特性,可以看到如果选择了(X1,Y1)这个点,那么X1与Y1都不能与其他点匹配了,不然的话棋子会互相攻击! 最后:找关键点,只要枚举每条边,删了,看看最大匹配有没有减小,减小了就是

hdu 4185 二分图匹配

题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 ...... .##... .##... ....#. ....## ...... Sample Output Case 1: 3 1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=1000; 4 char map[610][6

HDU 1281 二分图

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

过山车 HDU 2063 (二分图匹配裸题)

Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner.考虑到经费问题,boss刘决定只让找到partner的人去坐过山

Land of Farms HDU - 5556 二分图匹配

Farmer John and his brothers have found a new land. They are so excited and decide to build new farms on the land. The land is a rectangle and consists of N×MN×Mgrids. A farm consists of one or more connected grids. Two grids are adjacent if they sha

Girls and Boys HDU - 1068 二分图匹配(匈牙利)+最大独立集证明

最大独立集证明参考:https://blog.csdn.net/qq_34564984/article/details/52778763 最大独立集证明: 上图,我们用两个红色的点覆盖了所有边.我们证明的前提条件是已经达到最小覆盖. 即条件1.已经覆盖所有边,条件2.所用的点数最小 首先我们来证明蓝色点组成的是一个独立集:如果有两个蓝色点间有边相连,那么这条 边则没有被覆盖,则与条件1矛盾.因此是独立集. 再来证明这个独立集最大: 如果我们要再增加这个独立集中的点,则需要把某个红点变 成蓝点.而

HDU 1281 棋盘游戏 行列匹配

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