【字典序最小最大权独立集】uva12288

该博客探讨了UVA12288问题,即在有限网格上安排马以实现字典序最小且权值总和最大的不相攻击马的配置。通过行奇偶染色转换为二分图的最大权独立集问题,利用最小割方法和增广路径来确定解决方案的合法性。博客中提到,实际挑战主要在于处理各种约束条件,如强制放置马、负权重等,作者在比赛中经历了多次重构和手动测试,最终成功解决此问题。
摘要由CSDN通过智能技术生成

题意:在n*m的网格上填马,其攻击范围是±3,±1这种类型,每个格子有个权值,有些格子可以选,有些不能选,求一种字典序最小的,马互不攻击的,权值之和最大的一种方案

明显按行奇偶染色,就变成了二分图上的最大权独立集的问题,这个是个经典模型,然后考虑怎么输方案,按字典序枚举每个位置,如果想让这个位置必须选,那么就是它连向源或汇的边变为oo,使得最小割割不开,则判断其合法性就是看有没有一条到汇(源)点的增广路,也就是一次bfs就可以了,因此判断复杂度也是o((n*m)^2)的。比赛的时候还是黄哥机智的提出了这个idea,否则我就得每次暴力流一遍了。

其实这题烦的不是算法,而是各种情况,譬如至少放一个马,或者是有负数,同时你又必须选它之类的,比赛时写了一遍,之后又re了一遍,改到拍不出错之后,又手构了几种情况才终于过了。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
const int dx[8]={-1,-3,-3,-1,1,3,3,1};
const int dy[8]={-3,-1,1,3,3,1,-1,-3};
const int oo=1073741819;
using namespace std;
int tail[20000],next[500000],sora[500000];
int flow[1050][1050],col[1050][1050],id[1050][1050],g[2][
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值