博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1507--二分图最大匹配
阅读量:7045 次
发布时间:2019-06-28

本文共 2540 字,大约阅读时间需要 8 分钟。

题意:你大爷。哦不!

你大叔继承了一块地什么的都是废话。。安静,这里说说题意,和怎么建图。

题意:这里有一块N*M的地,可是有 K 个地方。是池塘,然后输入K行(x,y),OK,如今能够出售的地必须是 1*2 大小的矩形,而且不能是池塘。。。

问。在N*M的这块地上。能有多少块地能够出售,而且。要输出这些能够出售的地的坐标。

建图:那么这里事实上和我之前做过的hdu4185 差点儿相同1A。

那么能够预先处理一下,把N*M的地图中,是土地的按 1,2,3....编号。在这里我们须要对于每一个编号。记录这个编号的土地的坐标。那么这里他说了N*M-K <= 50。那么我们接着对于每一个土地,遍历四个方向,看看有木有能够组在一起变成能卖的地。然后。。。然后图就建好啦。

那么在二分匹配的过程中也要注意的是:匹配好的数量须要÷2,输出的时候也有点须要注意的,直接看代码中的解释:

#include 
#include
#include
using namespace std;#define MAX 105int N,M,K;int map[MAX][MAX];int loc[MAX/2][2];//这里是依据编号记录坐标 如第2个地的坐标 (loc[2][0] , loc[2][1]) int node_num; //点数,也就是土地的数量。编号的那个struct Edge{//邻接表 int to,next;}edge[MAX*4];int head[MAX/2],edge_num;void add(int u,int v){ edge[edge_num].to = v; edge[edge_num].next = head[u]; head[u] = edge_num++;}int vis[4][2]={0,1,0,-1,1,0,-1,0};void initMap(){ node_num = 1; memset(map,0,sizeof(map)); int x,y; while(K --){ cin >> x >> y; map[x][y] = -1;//表示此地不可用。是池塘 } for(int i = 1; i <= N; i ++){ for(int j = 1; j <= M; j ++){ if(!map[i][j]) { map[i][j] = node_num++; loc[node_num-1][0] = i; loc[node_num-1][1] = j;//记录坐标 } } } edge_num = 0; memset(head,-1,sizeof(head)); for(int i = 1; i <= N; i ++){ for(int j = 1; j <= M; j ++){ if(map[i][j] != -1){ for(int k = 0; k < 4; k ++) { int x = i+vis[k][0],y = j+vis[k][1]; if(map[x][y] != -1 && x >=1 && y >= 1 && x <= N && y <= M) { add(map[i][j],map[x][y]); add(map[x][y],map[i][j]); } } } } }}//------------------------bool useif[MAX/2];int link[MAX/2];bool dfs(int u){ for(int i = head[u]; i != -1; i = edge[i].next){ int v = edge[i].to; if(!useif[v]){ useif[v] = true; if(link[v] == -1 || dfs(link[v])) { link[v] = u; return true; } } } return false;}void match(){ int ans_num = 0; memset(link,-1,sizeof(link)); for(int i = 1; i <= node_num; i ++){ memset(useif,false,sizeof(useif)); if(dfs(i)) ans_num++; } //print cout << ans_num/2 <
> N >> M) { if(!N && !M) break; cin >> K; initMap(); if(!first_cas) cout << endl; match(); first_cas = false; } return 0;}
个人愚昧观点,欢迎指正与讨论
你可能感兴趣的文章
随手画个圆,你是怎么画的?我们分析了10万个圆,得到了这样的结论
查看>>
【C++】This指针和复制构造函数
查看>>
js中substring和substr的用法比较
查看>>
RESTful架构详解(转)
查看>>
工业物联网趋势已经形成
查看>>
一首诗的代码
查看>>
黑客靠什么活着?
查看>>
第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(3)
查看>>
云HBase独享本盘实例发布,存储成本下降7倍,专为物联网\车联网等大规模结构化存储服务...
查看>>
[20171206]rman与truncate.txt
查看>>
确保线程安全的几种方法
查看>>
开启php-fpm慢脚本日志
查看>>
Uber在伦敦运营执照被吊销,竞争对手 mytaxi 宣布立刻打折
查看>>
Sonos 大中华区总裁王汉华:我们不做内容、不做操作系统,做生态链的一环
查看>>
Spring Security笔记:解决CsrfFilter与Rest服务Post方式的矛盾
查看>>
查看gcc/g++默认include路径
查看>>
本期最新 9 篇论文,每一篇都想推荐给你 | PaperDaily #14
查看>>
CentOS7修改JAVA_HOME的环境变量
查看>>
背水一战 Windows 10 (33) - 控件(选择类): ListBox, RadioButton, CheckBox, ToggleSwitch
查看>>
PgSQL · 特性分析 · MVCC机制浅析
查看>>