一个n∗nn∗n的0101矩阵ai,jai,j,有些位置可以修改,代价为ci,jci,j。要求进行一些修改之后满足:设clicli为第ii行的11的个数,cricri为第ii列的11的个数,要求cli,cri∈[dli,dri],|cli−cri|≤kicli,cri∈[dli,dri],|cli−cri|≤ki。

问最少代价。

保证有解。

n≤100n≤100


不错的网络流练习题。

建立两排点分别表示行列,两两连边表示一个格子。不可以修改显然,如果可以修改,ai,j=0ai,j=0时连(i,j′,0,1,ci,j)(i,j′,0,1,ci,j),ai,j=1ai,j=1时先连(i,j′,1,1,0)(i,j′,1,1,0),再连(j′,i,0,1,ci,j)(j′,i,0,1,ci,j)表示退流。

循序渐进思考,假设ki=0ki=0,也就是行列相同,那么可以连(i,i,0,∞,0)(i,i,0,∞,0),求最小费用可行流。

扩展一下,可以这么连:建立源点汇点,连边(S,i,dl,dl+k,0),(i′,T,dl,dl+k,0),(i′,i,0,dr−dl−k,0)(S,i,dl,dl+k,0),(i′,T,dl,dl+k,0),(i′,i,0,dr−dl−k,0)。

从SS和i′i′流进ii的可以看做clicli,从i′i′流出到TT和ii的可以看做cricri。

可以发现一定满足cli,cri∈[dl,dr]cli,cri∈[dl,dr]。|cli−cri|=|(f(S,i)+f(i′,i))−(f(i′,T)+f(i′,i))|=|f(S,i)−f(i′,T)|≤k|cli−cri|=|(f(S,i)+f(i′,i))−(f(i′,T)+f(i′,i))|=|f(S,i)−f(i′,T)|≤k。

题解说如果用EK的话需要增广O(n2)O(n2)次,SPFA增广一次是O(nm)O(nm)所以是O(n5)O(n5),用Dij增广一次是O(n2)O(n2)(不写堆优化)所以是O(n4)O(n4)。

习惯性地些了zkw费用流很自然地TLE80了,有时间去补一下Dij费用流。

下面的代码是80分的代码。


using namespace std;
#include <bits/stdc++.h>
#define N 105
#define ll long long
int n,all;
int S,T,ss,tt;
int a[N][N],c[N][N];
int dl[N],dr[N],dk[N];
struct EDGE{
int to,c,w;
EDGE *las;
} e[200005];
int ne;
EDGE *last[N*2];
void link(int u,int v,int c,int w){
// printf("%d %d %d %d\n",u,v,c,w);
e[ne]={v,c,w,last[u]};
last[u]=e+ne++;
}
#define rev(ei) (e+(int((ei)-e)^1))
ll dis[N*2],maxflow,mincost;
bool vis[N*2];
ll dfs(int x,int s){
if (x==tt){
maxflow+=s;
mincost+=s*dis[ss];
return s;
}
int have=0;
vis[x]=1;
for (EDGE *ei=last[x];ei;ei=ei->las)
if (ei->c && !vis[ei->to] && dis[x]==dis[ei->to]+ei->w){
ll t=dfs(ei->to,min(ei->c,s-have));
ei->c-=t,rev(ei)->c+=t,have+=t;
if (have==s)
return s;
}
return have;
}
bool change(){
ll d=LLONG_MAX;
for (int i=1;i<=all;++i)
if (vis[i])
for (EDGE *ei=last[i];ei;ei=ei->las)
if (ei->c && !vis[ei->to])
d=min(d,dis[ei->to]+ei->w-dis[i]);
if (d==LLONG_MAX)
return 0;
for (int i=1;i<=all;++i)
if (vis[i])
dis[i]+=d;
return 1;
}
void flow(){
do
do
memset(vis,0,sizeof(bool)*(all+1));
while (dfs(ss,INT_MAX));
while (change());
}
void lk(int u,int v,int l,int r,int w){
if (r-l)
link(u,v,r-l,w),link(v,u,0,-w);
if (l){
link(ss,v,l,w),link(v,ss,0,-w);
link(u,tt,l,0),link(tt,u,0,0);
}
}
int ans[N][N];
void check(){
ll sum=0;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if (ans[i][j]!=a[i][j])
sum+=c[i][j];
for (int i=1;i<=n;++i){
int cl=0,cr=0;
for (int j=1;j<=n;++j)
cl+=ans[i][j],cr+=ans[j][i];
assert(cl<=dr[i] && cl>=dl[i]);
assert(cr<=dr[i] && cr>=dl[i]);
assert(abs(cl-cr)<=dk[i]);
}
assert(sum==mincost);
}
EDGE *p[N][N];
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d",&n);
S=n+n+1,T=n+n+2,ss=n+n+3,tt=n+n+4;
all=n+n+4;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
scanf("%d",&a[i][j]);
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j){
scanf("%d",&c[i][j]);
if (c[i][j]==-1){
if (a[i][j]==1)
lk(i,j+n,1,1,0);
}
else{
if (a[i][j]==0){
p[i][j]=e+ne;
lk(i,j+n,0,1,c[i][j]);
}
else{
lk(i,j+n,1,1,0);
p[i][j]=e+ne+1;
lk(j+n,i,0,1,c[i][j]);
// link(j+n,i,1,c[i][j]);
// link(i,j+n,0,-c[i][j]);
}
}
}
for (int i=1;i<=n;++i){
scanf("%d%d%d",&dl[i],&dr[i],&dk[i]);
dk[i]=min(dk[i],dr[i]-dl[i]);
lk(S,i,dl[i],dl[i]+dk[i],0);
lk(i+n,T,dl[i],dl[i]+dk[i],0);
lk(i+n,i,0,dr[i]-dl[i]-dk[i],0);
}
lk(T,S,0,INT_MAX,0);
flow();
printf("%lld\n",mincost);
for (int i=1;i<=n;++i,printf("\n"))
for (int j=1;j<=n;++j){
if (c[i][j]==-1)
ans[i][j]=a[i][j];
else
ans[i][j]=rev(p[i][j])->c;
printf("%d ",ans[i][j]);
}
check();
return 0;
}

ULR1 B. 【ULR #1】光伏元件的更多相关文章

  1. 04讲 正确使用heterogeneous类型的元件

    heterogeneous类型的元件1.可能出现的错误     再使用数个heterogeneous 元件的时候会因为分部件的不匹配 2.出现错误的原因原因是这四个运放,软件它并不识别那两个是配在一起 ...

  2. 建模元件有哪些在MapleSim中

    信号库:包含通用信号模块.布尔.控制器.离散信号模块.信号源.线性信号模块.非线性信号模块.时间离散信号模块.查询表.信号转换器.数学运算.关系元件.特殊信号模块,应用案例. 电子库:包含电阻.运算放 ...

  3. JMeter专题系列(三)元件的作用域与执行顺序

    1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(conf ...

  4. jmeter(六)元件的作用域与执行顺序

    jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同. jmeter的test pla ...

  5. 分布式光伏系列:分布式光伏电站 运行与维护方案一览(zz)

    原文:http://www.toutiao.com/a6353487210709516546/ 中小型光伏电站的特点是占地面积小.安装位置灵活且日常维护量少.由于光伏电站不同的运行环境,为了能够使光伏 ...

  6. Android常用元件

    本文来源于 http://blog.csdn.net/wxhlinux/article/details/8601170#comments 1.4  Android應用程式元件1.4.1  Activi ...

  7. JMeter常用测试元件—学习笔记

    线程组 Ramp-Up Period:告诉JMeter达到最大线程数需要多长时间.假定共有10个线程,Ramp-Up Period为100秒,那么JMeter就会在100秒内启动所有线程,并让它们运转 ...

  8. 【工具】【电子设计】超屌的 fritzing 新建元件

    fritzing 有多好,用了才知道,但是通常会遇到一个问题,他的元件库不一定够用,这时候就得自己做元件了,但是搜了一下网上没有相关的教程啊. 算了,去官网看英文吧.. 首先在最新版本不支持直接新建元 ...

  9. JMeter基础之--元件的作用域与执行顺序

    前面有介绍过jmeter的元件类别,对于新手来说,jmeter的元件是还是不少的,如果我们按照每一个元件的每一个参数的含义去学习,无疑会降低学习性能测试的热情,就算我们熟悉了所有元件以及元件上的参数了 ...

  10. 第1周 支路变量、元件、KCL和KVL

    第1周的内容,介绍了: 电阻.独立源.受控元件等实体元器件, 电流.电压.功率等抽象名词, 端口.参考方向等分析时的概念工具, KCL.KVL两大分析定律, 解线性电路的普适方法----2B法. 引入 ...

随机推荐

  1. 实验一-密码引擎-加密API研究

    实验一-密码引擎-加密API研究 API:应用程序接口(API:Application Program Interface)是一组定义.程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信 ...

  2. Linux 第七节( 磁盘配额,RAID )

    vim /etc/fstab    //编辑文件 UUID=xxxxxxxxxxxxxx /boot xfs defaults,uquota 0 0    //增加uqota命令,允许磁盘扩容 ino ...

  3. Linux内核红黑树1—Documentation/rbtree.txt翻译

    转自:https://www.cnblogs.com/hellokitty2/p/15362630.html 1. 什么是红黑树,它们有什么用?---------------------------- ...

  4. vue 3 引入 scss

    安装必要的依赖: 调用: 效果:

  5. win10 U盘重装系统

    1.做好U盘 2.F7选择U盘启动,不用F2切换启动顺序 3.IQY一键安装 4.重启前拔掉U盘 5.如果重启后蓝屏显示 恢复,重新进入PE使用 windows引导恢复,再重新启动

  6. DBeaver导入SQL脚本数据

    DBeaver导入SQL脚本数据 起因 Navicat Premium还原备份的导致数据库中文乱码 看Navicat Premium中看中文数据,是正常显示了,但是在IEDA查询和Web页面上显示,均 ...

  7. 解决Google翻译不能用的问题

    解决Google翻译不能用的问题   1.打开C:\Windows\System32\drivers\etc\hosts 2.在hosts后面加入 203.208.40.66 translate.go ...

  8. springcloud(三) - 负载均衡Ribbon

    功能介绍 基本保证每个服务不同的ip接收到的请求数量是一样的,确保在微服务下没有没有那个服务器负载过多而另外一个闲置. IRule:根据规则获取制定的服务 规则列表 RoundRobinRule:轮询 ...

  9. 服务器IPMI地址及用户名密码

    HP管理口:ILO默认用户/密码:Administrator/passwordHP以前管理口登陆MP卡通过网线连接MP卡的RJ-45口,通过telnet方式登录,默认用户/密码:Admin/Admin ...

  10. AutoCAD专用卸载工具,完美彻底卸载清除干净AutoCAD各种残留注册表和文件。

    AutoCAD专用卸载工具,完全彻底卸载删除干净AutoCAD各种残留注册表和文件的方法和步骤.如何卸载AutoCAD呢?有很多同学想把AutoCAD卸载后重新安装,但是发现AutoCAD安装到一半就 ...