CF1146G Zoning Restrictions 最小割

题意:
你准备在一条街上建房子。这条街上共有nn个地方可以用来建房子,每个房子高度最高为h。若你建了一个高度为aa的房子,那你将得到a^2的收益。但是这条街有mm个分区限制。具体来说,对于第ii个分区限制,若你在l_il 到r_ir 这段区间内最高的房子的高度严格大于了x_ix ,那你将受到c_ic 的罚款。求你的最大收益(房子收益-−罚款)
原题链接:http://codeforces.com/problemset/problem/1146/G 思路:
可以dp,这里讲一个最小割的网络流做法。
首先将每个点的0~h串起来,用h*h-利益将边转化成损失,每个点建图大致如下。跑出最小割之后h*h*n-maxflow就是答案了。

graph LR; id((S)) --inf--> id1((A0)) id1((A0))--h*h-0-->id2((A1)) id2((A1))--h*h-1-->id3((A2)) id3((A2))--h*h-4-->id4((A3)) id4((A3))--h*h-9-->id5((...)) id3((A2))--inf-->id6((lim1)) id6((lim1))--lim1-->id7((T)) id4((A3))--inf-->id8((lim2)) id8((lim2))--lim2-->id7((T)) classDef className fill:#f9f,stroke:#333,stroke-width:4px,fill-opacity:0.5 class id,id1,id2,id3,id4,id5,id6,id7,id8 className; linkStyle default fill:#fff,stroke:#f73,stroke-width:2px,fill-opacity:1.0;

说的不是很清楚,看代码即可。 代码:

#include<bits/stdc++.h>
#define FIO std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const ll inf=1e9+7;
const int MAXN = 3010;//点数的最大值
const int MAXM = 10010;//边数的最大值
const int INF = 1e9+7;
struct Edge
{int to,next,cap,flow;
} edge[MAXM]; //注意是 MAXM
int tol;
int head[MAXN];
void init()
{tol = 2;memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w,int rw = 0)
{edge[tol].to = v;edge[tol].cap = w;edge[tol].flow = 0;edge[tol].next = head[u];head[u] = tol++;edge[tol].to = u;edge[tol].cap = rw;edge[tol].flow = 0;edge[tol].next = head[v];head[v] = tol++;
}
int Q[MAXN];
int dep[MAXN],cur[MAXN],sta[MAXN];
bool bfs(int s,int t,int n)
{int front = 0,tail = 0;memset(dep,-1,sizeof(dep[0])*(n+1));dep[s] = 0;Q[tail++] = s;while(front < tail){int u = Q[front++];for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(edge[i].cap > edge[i].flow && dep[v] == -1){dep[v] = dep[u] + 1;if(v == t)return true;Q[tail++] = v;}}}return false;
}
int dinic(int s,int t,int n)
{int maxflow = 0;while(bfs(s,t,n)){for(int i = 0; i < n; i++)cur[i] = head[i];int u = s, tail = 0;while(cur[s] != -1){if(u == t){int tp = INF;for(int i = tail-1; i >= 0; i--)tp = min(tp,edge[sta[i]].cap-edge[sta[i]].flow);maxflow += tp;for(int i = tail-1; i >= 0; i--){edge[sta[i]].flow += tp;edge[sta[i]^1].flow -= tp;if(edge[sta[i]].cap-edge[sta[i]].flow == 0)tail = i;}u = edge[sta[tail]^1].to;}else if(cur[u] != -1 && edge[cur[u]].cap > edge[cur[u]].flow && dep[u] + 1 == dep[edge[cur[u]].to]){sta[tail++] = cur[u];u = edge[cur[u]].to;}else{while(u != s && cur[u] == -1)u = edge[sta[--tail]^1].to;cur[u] = edge[cur[u]].next;}}}return maxflow;
}int n,m,h,l,r,x,c;
inline int idx(int x,int y){return x*(h+1)+(y+1);
}
int main(){FIO;int tt;cin>>n>>h>>m;int ans=h*h*n;init();int s=0,t=n*(h+1)+m+1;for(int i=0;i<n;i++){addedge(s,idx(i,0),inf);for(int j=0;j<h;j++){addedge(idx(i,j),idx(i,j+1),h*h-j*j);}}for(int i=1;i<=m;i++){cin>>l>>r>>x>>c;for(int j=l;j<=r;j++){if(x<h)addedge(idx(j-1,x+1),n*(h+1)+i,inf);}addedge(n*(h+1)+i,t,c);}cout<<ans-dinic(s,t,t+1)<<endl;return 0;
}

转载于:https://www.cnblogs.com/zhangxianlong/p/10918172.html

CF1146G Zoning Restrictions 最小割相关推荐

  1. CF1146G Zoning Restrictions

    CF1146G Zoning Restrictions 网络流 h<=50? 直接都选择最大的,ans=n*h*h 最小割 考虑舍弃或者罚款 有一个>x就要罚款? 经典取值限制的模型:切糕 ...

  2. Forethought Future Cup - Elimination Round G. Zoning Restrictions 最大流(最小割)

    题目链接: https://codeforces.com/contest/1146/problem/G 题意: 你现在要给 nnn 个位置制定高度 hi(1<=hi<=H)h_i (1&l ...

  3. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  4. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  5. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  6. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  7. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  8. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  9. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

最新文章

  1. 《科学》盘点2018可能被聚焦的研究领域
  2. 网络电缆 计算机电缆,计算机电缆的技术参数
  3. dojo 十 ajax dojo/_base/xhr
  4. ionic中定义路由的问题
  5. 国产数据库崛起 Gartner!
  6. FileZilla,读取目录列表失败(425 Can‘t open data connection.)的解决办法
  7. idea oracle 工具,IntelliJ IDEA的数据库管理工具实在太方便了
  8. 服务器美萍管理系统,美萍服装管理软件互联网版(Web会员管理软件、连锁店会员卡管理系统、B/S版连锁会员管理系统)...
  9. OSG中读取shp数据
  10. 恢复出厂设置 Factory Reset 调用过程
  11. 用c++语言写1加到100,C++ 语言实现1加到100(初学者)
  12. 更新显卡驱动后,Windows重启卡在Logo页面
  13. DINO 论文精度,并解析其模型结构 DETR 的变体
  14. 使用https请求接口报:javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常的问题处理
  15. 利用同义词简化SQL Server 2005开发
  16. 计算机硬盘大小及区分数怎么看,一分钟解读:教你如何看SSD测试成绩
  17. 程序猿如何保护眼睛方法.
  18. 腾讯视频 电视剧/电影 分类统计大全
  19. 2008最火爆的十大网络流行语:
  20. Unity3D之SQLite的使用

热门文章

  1. 用大数据解决“痛点”问题 “云上贵州”再发力
  2. php intval获取手机号,微信小程序获取微信绑定授权手机号getPhoneNumber
  3. 英特尔对手机的几个痛苦领悟
  4. 使用math.sin时报错only size-1 arrays can be converted to Python scalar
  5. android sqlite3设置密码,sqlite3 加密
  6. 系统调优之四大天王——快来瞧瞧~
  7. PHP加载lod,面向大场景模型web端动态渲染LOD处理方法与流程
  8. spring 调用python_引用spring
  9. 【git】error: .repo/manifests/: contains uncommitted changes解决思路
  10. numeric转换varchar_数据库中varchar类型数据转换为numeric类型