BZOJ1458 士兵占领题解(最大流)

本文介绍了一个关于矩阵填充的问题,通过构建网络流模型来解决矩阵中特定行和列的最小填充数量问题。利用最大流算法确定可行解及最小填充数目。

题目:BZOJ1458.
题目:有一个 n ∗ m n*m nm的矩阵,有 k k k个位置不能填.现在限制第 i i i行至少填 C i C_i Ci格,第 i i i列至少填 L i L_i Li格,判定是否可以满足条件,并在满足条件时输出最少需要填的格子数.
1 ≤ n , m ≤ 100 1\leq n,m\leq 100 1n,m100.

首先判定很容易,我们只考虑如何填最少的格子.

当然可以上下界网络流做,不过感觉上下界有些大材小用了.

考虑先把所有可以填的格子填上,我们记填入的数量为 s u m sum sum;然后考虑去掉最多的格子,记去掉的格子数量为 m x mx mx,那么答案就是 s u m − m x sum-mx summx.

显然 s u m sum sum是很好求的,考虑如何求 m x mx mx.

考虑对每行建一个点,由源点往每个点连一条边,流量为这一行可以去掉格子的最大数量(将那些不能填的格子也考虑进去);对每列建一个点,每个点向汇点连一条边,流量为这一列可以去掉格子的最大数量;若某个位置上的点 ( i , j ) (i,j) (i,j)可以填,则由第 i i i行向第 j j j列连一条流量为 1 1 1的边.最后跑一个最大流就是 m x mx mx.

代码如下:

#include<bits/stdc++.h>
  using namespace std;

#define Abigail inline void
typedef long long LL;

const int N=100,INF=(1<<30)-1;

int n,m,sk,a[2][N+9],b[N+9][N+9],st,td;
struct side{
  int y,next,f;
}e[N*(N+2)*2+9];
int lin[N*2+9],cs;

void Ins(int x,int y,int v){e[++cs].y=y;e[cs].f=v;e[cs].next=lin[x];lin[x]=cs;}

queue<int>q;
int dis[N*2+9];

bool Bfs_div(int st,int td){
  for (int i=1;i<=n;++i) dis[i]=0;
  dis[st]=1;q.push(st);
  while (!q.empty()){
    int t=q.front();q.pop();
    for (int i=lin[t];i;i=e[i].next)
      if (!dis[e[i].y]&&e[i].f)
      	dis[e[i].y]=dis[t]+1,q.push(e[i].y);
  }
  return dis[td];
}

int cur[N*2+9];

int Dfs_path(int k,int td,int flow){
  if (k==td) return flow;
  int res=0;
  for (int &i=cur[k];i;i=e[i].next)
    if (dis[k]+1==dis[e[i].y]&&e[i].f){
      int t=Dfs_path(e[i].y,td,min(flow,e[i].f));
      flow-=t;res+=t;
      e[i].f-=t;e[i^1].f+=t;
      if (!flow) return res;
    }
  return res;
}

int Max_flow(int st,int td){
  int res=0;
  for (;Bfs_div(st,td);res+=Dfs_path(st,td,INF))
    for (int i=1;i<=n;++i) cur[i]=lin[i];
  return res;
}

int ans,sum; 

Abigail into(){
  scanf("%d%d%d",&n,&m,&sk);
  for (int i=1;i<=n;++i){
    scanf("%d",&a[0][i]);
    a[0][i]=m-a[0][i];
  }
  for (int i=1;i<=m;++i){
    scanf("%d",&a[1][i]);
    a[1][i]=n-a[1][i];
  }
  sum+=n*m;
  for (int i=1;i<=sk;++i){
  	int x,y;
  	scanf("%d%d",&x,&y);
  	if (!b[x][y]) --a[0][x],--a[1][y],--sum;
  	if (a[0][x]<0||a[1][y]<0) ans=-1;
    b[x][y]=1;
  }
}

Abigail work(){
  if (ans<0) return;
  cs=1;
  for (int i=1;i<=n;++i)
    for (int j=1;j<=m;++j)
      if (!b[i][j]) Ins(i,j+n,1),Ins(j+n,i,0);
  st=n+m+1;
  for (int i=1;i<=n;++i)
    Ins(st,i,a[0][i]),Ins(i,st,0);
  td=n+m+2;
  for (int i=1;i<=m;++i)
    Ins(i+n,td,a[1][i]),Ins(td,i+n,0);
  n=td;
  ans=sum-Max_flow(st,td);
}

Abigail outo(){
  ans<0?puts("JIONG!"):printf("%d\n",ans);
}

int main(){
  into();
  work();
  outo();
  return 0;
}
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,UML(统一建模语言)被视为一种通用的建模手段,其主要功能在于对软件开发过程中的各种概念进行可视化呈现,从而使得复杂系统结构的理解、设计及沟通变得更加便捷。以"个人通讯录系统uml图"为例,本案例将详细阐述如何运用UML图,尤其是ER图(实体关系图),来构建一个个人通讯录系统的数据模型。 首先,让我们对UML图的基本分类有所认识。UML图涵盖了多种类型,包括但不限于用例图、类图、序列图、协作图、状态图、活动图、组件图以及部署图。就本项目的实际情况而言,用例图(用于描述用户与系统的互动过程)、类图(界定对象与类之间的关联性)以及ER图(揭示数据库中实体及其相互联系)将是最为关键的应用。 用例图通过展现系统的主要参与者(users)及其能够执行的操作(use cases),并明确这些操作之间的相互联系,来描绘系统的核心功能。在个人通讯录系统的应用场景中,参与者可能涵盖普通用户,而用例则可能涉及添加联系人、搜索联系人、修改联系人信息以及删除联系人等操作。 类图则着重于展示类的组织结构,其中包括类名、属性和方法。在个人通讯录系统的构建过程中,可以设立一个"Contact"类来代表单个联系人,该类将包含诸如姓名、电话、邮箱等属性。同时,还可以设计一个"AddressBook"类来负责管理多个联系人,此类将集成添加、删除和查找联系人的功能。 ER图作为数据库设计的核心工具,主要用于表达实体、属性以及实体间的关联关系。在个人通讯录系统的设计中,实体可能包含"User"(用户)和"Contact"(联系人)。"User"实体可能具备用户名、密码等属性,而"Contact"实...
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 标题中所提及的“PB9转换utf-8例子”具体描述了在PowerBuilder 9(PB9)环境中,将数据从非UTF-8编码格式转变为UTF-8编码格式的一种具体方案。鉴于PB9本身并不具备直接进行此类编码转换的功能,开发人员通常需要借助外部库或者特定的编程策略来达成这一功能。在此例中,采用了ADODB.Stream对象,该对象是Microsoft ActiveX Data Objects (ADO)框架内的一部分,它能够支持多种类型流数据的处理,其中包括文本数据的编码变更。 描述部分指出,由于PowerBuilder 9及其以下版本未内建直接的字符编码转换机制,因此需要借助ADODB.Stream。这个对象提供了一种途径,通过读取原始编码的文本,并将其写入到新的以UTF-8编码的流中,从而实现转换。这一过程一般包括启动一个流对象,设定其编码类型,读取原始数据,然后以目标编码(此处为UTF-8)写入到新流,最终保存结果。 标签“pb9 utf-8”清晰地表明了讨论的主题是关于PowerBuilder 9与UTF-8编码相关的问题。UTF-8是一种应用广泛的Unicode字符编码,能够表示Unicode字符集中几乎所有字符,涵盖了全球多种语言文字。 在压缩包内的文件清单中,包含了四个与PowerBuilder相关的文件(utf-8.pbl、utf-8.pbt、utf-8.pbw)以及三个文本文件(aaa.txt、www.txt、bbb.txt)。这四个PB文件或许包含了示例代码、项目配置和工作区信息,用于展示如何运用ADODB.Stream进行编码转换。而aaa.txt、www...
内容概要:本文提出了一种基于粒子群算法(PSO)融合动态窗口法(DWA)的无人机三维动态避障路径规划方法,旨在解决无人机在复杂、动态环境中安全高效飞行的路径规划难题。该方法通过Matlab代码实现,有效结合了PSO算法的全局寻优能力与DWA算法的局部实时避障优势,能够在存在移动障碍物的三维空间中规划出平滑、安全且优化的飞行路径。研究内容涵盖算法原理设计、融合机制构建、仿真环境搭建、路径规划性能测试与分析,充分验证了该融合策略在应对动态障碍物、提升避障实时性与路径质量方面的优越性。; 适合人群:具备一定编程基础和无人系统相关知识的科研人员,特别适用于从事无人机自主导航、智能优化算法、机器人路径规划等领域研究的研究生、高校教师及工程技术人员。; 使用场景及目标:①应用于城市、森林、灾害救援等复杂动态环境下的无人机自主飞行与实时避障;②为智能交通、物流配送、电力巡检、安防监控等领域的移动机器人路径规划提供先进的算法参考和技术解决方案;③作为智能优化算法与机器人技术融合教学与科研实验的重要案例。; 阅读建议:建议读者结合提供的Matlab代码进行仿真实验,深入理解PSO与DWA的融合逻辑、关键参数的敏感性分析及避障效果的评价指标,鼓励在掌握核心思想的基础上进行算法改进与创新应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值