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

思路:这题关键是建图,我们可以把坐标映射建双向图,最后求得的最大匹配数/2就ok了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 #define MAXN 10010
 8 vector<int>map[MAXN];
 9 int n,m,k;
10 bool mark[MAXN];
11 bool visited[111][111];
12 int ly[MAXN];
13
14 int dfs(int u) {
15     for(int i=0; i<map[u].size(); i++) {
16         int v=map[u][i];
17         if(!mark[v]) {
18             mark[v]=true;
19             if(ly[v]==-1||dfs(ly[v])) {
20                 ly[v]=u;
21                 return 1;
22             }
23         }
24     }
25     return 0;
26 }
27
28
29 int MaxMatch() {
30     int res=0;
31     memset(ly,-1,sizeof(ly));
32     for(int i=1; i<=n*m; i++) {
33         memset(mark,false,sizeof(mark));
34         res+=dfs(i);
35     }
36     return res;
37 }
38
39
40 int main() {
41   //  freopen("1.txt","r",stdin);
42     int u,v;
43     while(scanf("%d%d",&n,&m),(n+m)) {
44         for(int i=1; i<=n*m; i++)map[i].clear();
45         scanf("%d",&k);
46         memset(visited,false,sizeof(visited));
47         for(int i=1; i<=k; i++) {
48             scanf("%d%d",&u,&v);
49             visited[u][v]=true;
50         }
51         for(int i=1; i<=n; i++) {
52             for(int j=1; j<=m; j++) {
53                 if(visited[i][j])continue;
54                 if(i+1<=n&&!visited[i+1][j]) {
55                     map[(i-1)*m+j].push_back(i*m+j);
56                     map[i*m+j].push_back((i-1)*m+j);
57                 }
58                 if(j+1<=m&&!visited[i][j+1]) {
59                     map[(i-1)*m+j].push_back((i-1)*m+j+1);
60                     map[(i-1)*m+j+1].push_back((i-1)*m+j);
61                 }
62             }
63         }
64         int ans=MaxMatch();
65         printf("%d\n",ans/2);
66         for(int i=1; i<=n*m; i++) {
67             if(ly[i]!=-1&&ly[ly[i]]!=-1) {
68                 int y1=i%m;
69                 if(y1==0)y1=m;
70                 int x1=(i-y1)/m+1;
71                 int y2=ly[i]%m;
72                 if(y2==0)y2=m;
73                 int x2=(ly[i]-y2)/m+1;
74                 ly[i]=ly[ly[i]]=-1;
75                 printf("(%d,%d)--(%d,%d)\n",x1,y1,x2,y2);
76             }
77         }
78         puts("");
79     }
80     return 0;
81 }

View Code

转载于:https://www.cnblogs.com/wally/archive/2013/06/05/3119701.html

hdu 1507(最大匹配)相关推荐

  1. HDU 1507 Uncle Tom's Inherited Land(最大匹配+分奇偶部分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1507 题目大意:给你一张n*m大小的图,可以将白色正方形凑成1*2的长方形,问你最多可以凑出几块,并输 ...

  2. hdu 2063+hdu 1083(最大匹配数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分匹配水题,求最大匹配数(即求边数最多的匹配),匈牙利算法实现.. View Code 1 # ...

  3. hdu 1507 Uncle Tom's Inherited Land*

    这两天刚学二分图,对二分图的应用还不熟练;感觉自己还是太弱了,这题是参考别人代码的; 这题是把(i+j)的值得奇偶性来分图的,请原谅我没有想到,还是太水了..根本没有思路.. 先用一个数组暂时存起鱼塘 ...

  4. hdu 1845(最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1845 思路:匈牙利算法应用,900ms+险过.(好像直接n/2就行) 1 #include<io ...

  5. 解题报告 (九) 二分图最大匹配

    文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...

  6. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  7. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

  8. hdu 3729(二分图最大匹配+最大字典序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3729 解题思路:节点i对Xi~Yi之间的每一个点都连一条边,这样问题就转化成二分图的最大匹配了.字典序 ...

  9. hdu 2444(二分图的判断以及求最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2444思路:首先要判断能否构成二分图,用bfs对当前点u染色,对u的邻接点v的颜色进行判断,如果为染色, ...

最新文章

  1. 几行代码搞定ML模型,低代码机器学习Python库正式开源
  2. LeetCode 7. 整数反转 Reverse Integer 官网答案的条件判定的一点思考
  3. 在Windows下,用Hexo搭建博客
  4. 百万数据报表导出:原理分析与总结
  5. CRM、DMP、CDP的区别
  6. html json解析插件,jQuery插件jsonview展示json数据
  7. PostgreSQL+安装及常见问题
  8. C/C++遍历Windows文件夹下的所有文件
  9. 常用视频格式与视频编解码标准介绍
  10. 【正版软件】Virtual Display Manager 虚拟显示器布局配置管理软件
  11. 项目管理面试常见问题及答案
  12. MIT 麻省理工学院公开课程视频下载方法
  13. html扫码支付,WEB端第三方支付接入 - 支付宝 - 扫码支付
  14. nginx 配置后缀
  15. 五分钟理解MVC三层架构
  16. 赵栋/东文才 《面向对象程序设计(java)》第十一周学习总结
  17. json对象与json字符串互转,ajax各常见函数
  18. DevOps之五Jenkins
  19. 和陆琪一起侃一侃在这个看脸的世界,容貌改变命运
  20. 元宇宙区块链游戏开发 元宇宙手机游戏开发

热门文章

  1. Berkeley DB(六) -- DB Replication (HA)上部
  2. 多媒体查询@media
  3. 零点是结束,也是开始。
  4. 红米和小米手机有什么本质区别?
  5. 苦口之药的拼音及解释
  6. 报纸、电商、PC互联网颠覆传统行业,带来新的生态,自媒体也一样
  7. 公司创立之初,人脉、资金等资源不足怎么办?
  8. 摆摊真的一个月能上万嘛
  9. 别人25岁就拥有了自己的事业,我30岁还在打工
  10. UEFI---(NT32)的第一个代码