bzoj4873
http://www.lydsy.com/JudgeOnline/problem.php?id=4873
最大权闭合子图。。。
建图:
1.d[i][j]:i->j区间的费用,d[i][j] > 0 ins(S,id(i,j),d[i][j]) 否则ins(id(i,j),T,-d[i][j]) 套路
2.对于寿司怎么搞,m=1,ins(种类,T,a[i]*a[i]),ins(寿司,种类,inf):必须割掉初始的费用,ins(寿司,T,a[i]),ins(区间,寿司, inf):每个区间割掉需要寿司的花费
3.ins(id(i,j),id(i+1,j),inf),ins(id(i,j),id(i,j-1),inf):选了大的区间的必须选小的区间
但是上面有一步可以改进,就是2的最后。因为选了大的一定会选小的,那么我们只用将[i,i]这个区间向寿司连边就行了。
记住a[i]有1000,并且汇点不要取太小。。。
#include<bits/stdc++.h>
using namespace std;
const int N = , inf = << ;
struct edge {
int nxt, to, f;
} e[N * ];
int dis[N], used[N], head[N], q[N], iter[N], d[][], a[N];
int n, m, sum, T = , num = , cnt = ;
namespace maxflow
{
void link(int u, int v, int f)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].f = f;
}
void ins(int u, int v, int f)
{
link(u, v, f); link(v, u, );
}
bool bfs()
{
int l = , r = ; q[++r] = ;
memset(dis, , sizeof(dis)); dis[] = ;
while(l <= r)
{
int u = q[l++];
for(int i = head[u]; i; i = e[i].nxt) if(!dis[e[i].to] && e[i].f)
{
dis[e[i].to] = dis[u] + ;
q[++r] = e[i].to;
}
}
return dis[T] > ;
}
int dfs(int u, int delta)
{
if(u == T) return delta;
int ret = ;
for(int &i = iter[u]; i && delta; i = e[i].nxt) if(e[i].f && dis[e[i].to] == dis[u] + )
{
int x = dfs(e[i].to, min(delta, e[i].f));
e[i].f -= x; e[i ^ ].f += x;
ret += x; delta -= x;
}
return ret;
}
int id(int i, int j) { return (i - ) * n + j; }
void build()
{
//每个编号和T连边,每个寿司和对应编号连边
int D = n * n;
T = N - ;
for(int i = ; i <= n; ++i)
{ // i + D:寿司 a[i] + 2 * D: 种类 id(i, i): 区间
ins(i + D, T, a[i]); //每个寿司
if(d[i][i] < ) ins(id(i, i), T, -d[i][i]);
else ins(, id(i, i), d[i][i]);
ins(id(i, i), i + D, inf);
if(!m) continue;
if(!used[a[i]])
{
used[a[i]] = ;
ins(a[i] + * D, T, a[i] * a[i]);
}
ins(i + D, a[i] + * D, inf);
}
for(int i = ; i <= n; ++i)
for(int j = i + ; j <= n; ++j)
{
if(d[i][j] < ) ins(id(i, j), T, -d[i][j]);
else ins(, id(i, j), d[i][j]);
if(i < n) ins(id(i, j), id(i + , j), inf);
if(j > ) ins(id(i, j), id(i, j - ), inf);
}
}
int dinic()
{
int ret = ;
while(bfs())
{
for(int i = ; i <= T; ++i) iter[i] = head[i];
ret += dfs(, inf);
}
return ret;
}
} using namespace maxflow;
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i) scanf("%d", &a[i]);
for(int i = ; i <= n; ++i)
for(int j = i; j <= n; ++j)
{
scanf("%d", &d[i][j]);
if(d[i][j] > ) sum += d[i][j];
}
build();
sum -= dinic();
printf("%d\n", sum);
return ;
}
bzoj4873的更多相关文章
- 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)
[BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...
- 【BZOJ4873】[Shoi2017]寿司餐厅 最大权闭合图
[BZOJ4873][Shoi2017]寿司餐厅 Description Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di ...
- BZOJ4873 Shoi2017寿司餐厅(最小割)
选择了某个区间就必须选择其所有子区间,容易想到这是一个最大权闭合子图的模型.考虑将区间按长度分层,相邻层按包含关系连边,区间[i,j]的权值即di,j,其中最后一层表示长度为1的区间的同时也表示寿司本 ...
- BZOJ4873 [Shoi2017]寿司餐厅 【最大权闭合子图】
题目链接 BZOJ4873 题解 题意很鬼畜,就可以考虑网络流[雾] 然后就会发现这是一个裸的最大权闭合子图 就是注意要离散化一下代号 #include<algorithm> #inclu ...
- 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 369 Solved: 256[Submit][Status ...
- [bzoj4873]寿司餐厅
来自FallDream的博客,未经允许,请勿转载,谢谢. Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di,i,不同种类的 ...
- BZOJ4873[Shoi2017]寿司餐厅——最大权闭合子图
题目描述 Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个 代号ai和美味度di,i,不同种类的寿司有可能使用相同的代号.每种寿司的份数都是无 ...
- bzoj4873(最大权闭合子图)
今天学了最大权闭合子图..然后找了这道题,发现完全不会..... 看了题解发现这种有诸如选了一个就一定要选另外的一些的限制又要求最优值的题有的可以转化成最大权闭合子图, 这个题我们首先想到不会选相交的 ...
- bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅
http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...
- bzoj4873 [Shoi2017]寿司餐厅
Input 第一行包含两个正整数n,m,分别表示这家餐厅提供的寿司总数和计算寿司价格中使用的常数. 第二行包含n个正整数,其中第k个数ak表示第k份寿司的代号. 接下来n行,第i行包含n-i+1个整数 ...
随机推荐
- PHP:Mysql 基础类
文章来源:http://www.cnblogs.com/hello-tl/p/7592547.html <?php /** * __construct($Mysql_config) 构造函数 $ ...
- 理解ZAB协议
ZAB协议 介绍 1.zab协议是为分布式协调服务zookpeer专门设计的一种支持崩溃恢复的原子广播协议 2.在zookeeper中主要依赖ZAB协议来实现数据一致性,基于该协议zk实现了一种主备模 ...
- 75-ADMI,Average Directional Movement Index,平均方向性运动指标.(2015.7.1)
ADMI,Average Directional Movement Index 平均方向性运动指标 Directional Movement Index,平均方向性运动指标.(2015.7.1)&qu ...
- 24L01-2.4G无线传输模块调节记录
在调试24L01的时候,虽然能用到别人的程序,但仅仅是程序的初始化,并没有告诉我们如何去后续的操作,如何去再次发送一组数.最近调试24L01接近尾声,将逐一的地方总结下来,以便以后查阅,也供其他人借鉴 ...
- Mybatis_HelloWorld
[梗概] 1.根据XML配置文件(全局配置文件,有数据源的一些运行信息)创建一个SqlSessionFactory对象. 2.sql映射文件:配置了每一个sql以及sql的封装规则. 3.将sql映射 ...
- (dede)织梦系统二次开发笔记
(dede)织梦系统二次开发记录 --soulsjie 一.模板常用文件说明 模板文件都在文件夹templets下,我们以默认模板(default)为例,对模板文件结构进行分析: 首页模板文件目录 \ ...
- CodeForcesGym 100512D Dynamic LCA
Dynamic LCA Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. ...
- JavaEE JDBC 核心API
JDBC接口核心的API @author ixenos java.sql.* 和 javax.sql.* |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口 ...
- MVC Ajax.BeginForm重复提交解决方法
mvc使用MVC Ajax.BeginForm提交的时候有重复提交结果的时候检查相关js文件引用情况, 其中mvc4注意 1 2 3 4 @Scripts.Render("~/bundles ...
- Linux find常用命令
今天研究一下find的一些常用的命令. find格式:find filepath [-option] [-print|-exec|-ok...] 其中常用的option主要有 -type d|f|s| ...