二分图行列匹配与最大匹配必须边

hdu1287

题意:在棋盘上放置车,要求车不能相互攻击,即要求车要在不同的行和列,二分图行列匹配

但是又问,那些点如果不放置车,就不能形成最大匹配,即哪些边是最大匹配的必须边

判断是否是最大匹配的必须边,只要删除该边之后做匹配,将匹配的个数与原先的个数比较就知道该边是不是最大匹配的必须边

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N = 100 + 10;
 4 int Map[N][N];
 5 int n,m,k;
 6 bool vis[N];
 7 int cy[N],cx[N];
 8
 9 bool dfs(int u)
10 {
11     for(int i=0; i<m; ++i)
12     {
13         if(!vis[i] && Map[u][i]==1)
14         {
15             vis[i] = true;
16             if(cy[i]==-1 || dfs(cy[i]))
17             {
18                 cy[i] = u;
19                 cx[u] = i;
20                 return true;
21             }
22         }
23     }
24     return false;
25 }
26 int MaxMatch()
27 {
28     memset(cx, -1, sizeof(cx));
29     memset(cy, -1, sizeof(cy));
30     int cnt = 0;
31     for(int i=0; i<n; ++i)
32     {
33         if(cx[i] == -1)
34         {
35             memset(vis, 0, sizeof(vis));
36             cnt += dfs(i);
37         }
38     }
39     return cnt;
40 }
41 int main()
42 {
43     int i,j,x,y;
44     int tCase = 1;
45     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
46     {
47         memset(Map, 0, sizeof(Map));
48         for(i=0; i<k; ++i)
49         {
50             scanf("%d%d",&x,&y);
51             x-=1;y-=1;
52             Map[x][y] = 1;
53         }
54         int ans = MaxMatch();
55         int ans2 = 0;
56         for(i=0; i<n; ++i)
57             for(j=0; j<m; ++j)
58                 if(Map[i][j] == 1)
59                 {
60                     Map[i][j] = 0;//删边
61                     int cnt = MaxMatch();
62                     if(cnt != ans)
63                         ans2++;
64                     Map[i][j] = 1;
65                 }
66         printf("Board %d have %d important blanks for %d chessmen.\n",tCase++,ans2,ans);
67     }
68     return 0;
69 }
时间: 2024-11-10 01:21:33

二分图行列匹配与最大匹配必须边的相关文章

二分图行列匹配---&gt; hdu2119,hdu1498

hdu2119 题意:给定一个矩形方格,每个格子里面的数字是0或者1,每次操作可以把一整行或列的1变成0,问最少多少次操作能将1全部变为0 一次可以消除某一行或者某一列的1但是可以这么想,最多有多少个1即不在同一行,也不在同一列,有多少个,那么就要消多少次那么就是求行和列的最大匹配 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 100 + 10; 4 int Map[N][N]; 5 bool vis[N];

最大匹配必须边

poj1486 题意: 给出一些矩形的坐标和一些点的坐标,若点在矩形内,则该点和该矩形匹配. 问哪些匹配边是可以唯一确定的,可以先求出最大匹配,然后每次删除一条匹配边, 然后再求最大匹配,如果匹配个数不变,那么该边不是必须边,否则就是必须边 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 1000; 4 struct node 5 { 6 int xMin,xMax,yMin,yMax; 7 }slide[N];

poj 1486(二分图必须边)

题意:有n张幻灯片重叠在一起,给出了每张矩形幻灯片在坐标系上的范围大小,然后给出了n个页码在坐标系的位置,因为幻灯片都是透明的所以无法确定页码是在哪个幻灯片上,需要判断有哪些幻灯片的页码可以确定,幻灯片给出的顺序是A-,页码给出的顺序是1-. 题解:先建图,幻灯片是一个集合,页码是另一个集合,页码a在幻灯片b内部可以连一条边,然后先进行二分图匹配找到最大匹配数,然后枚举每一条边,如果删除这条边再进行以此二分图匹配,这时得到的最大匹配数如果和之前的不相等(页码可以有其他的幻灯片匹配),说明这条边是

kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选

HDU 1281 棋盘游戏 行列匹配

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

hihoCoder 1393 网络流三&#183;二分图多重匹配(Dinic求二分图最大多重匹配)

#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选手参加. 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加

Regionals 2015 &gt;&gt; Asia - Tehran &gt;&gt; 7530 - Cafebazaar【二分图最佳匹配】【KM】【最大费用流】

Regionals 2015 >> Asia - Tehran >> 7530 - Cafebazaar 题目链接:7530 题目大意:一个公司有n个开发者,有m个APP可开发.其中一些开发者必选,一些APP必选.已知每个开发者开发每个APP的收益,求最大收益.(每个开发者最多开发一个APP,每个APP最多一个人开发) 题目思路: 解法一:二分图最佳匹配(KM算法) 增加一些虚开发者和虚app,非必要app可以被虚开发者开发,收益为0,反过来非必要开发者可以开发虚app,收益为0.

hdu 3605 Escape (二分图多重匹配)

Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4298    Accepted Submission(s): 1129 Problem Description 2012 If this is the end of the world how to do? I do not know how. But now scient

hdu2444 二分图的匹配,先判断是否为二分图

http://acm.hdu.edu.cn/showproblem.php?pid=2444 Problem Description There are a group of students. Some of them may know each other, while others don't. For example, A and B know each other, B and C know each other. But this may not imply that A and C