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的更多相关文章

  1. 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)

    [BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...

  2. 【BZOJ4873】[Shoi2017]寿司餐厅 最大权闭合图

    [BZOJ4873][Shoi2017]寿司餐厅 Description Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di ...

  3. BZOJ4873 Shoi2017寿司餐厅(最小割)

    选择了某个区间就必须选择其所有子区间,容易想到这是一个最大权闭合子图的模型.考虑将区间按长度分层,相邻层按包含关系连边,区间[i,j]的权值即di,j,其中最后一层表示长度为1的区间的同时也表示寿司本 ...

  4. BZOJ4873 [Shoi2017]寿司餐厅 【最大权闭合子图】

    题目链接 BZOJ4873 题解 题意很鬼畜,就可以考虑网络流[雾] 然后就会发现这是一个裸的最大权闭合子图 就是注意要离散化一下代号 #include<algorithm> #inclu ...

  5. 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 369  Solved: 256[Submit][Status ...

  6. [bzoj4873]寿司餐厅

    来自FallDream的博客,未经允许,请勿转载,谢谢. Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di,i,不同种类的 ...

  7. BZOJ4873[Shoi2017]寿司餐厅——最大权闭合子图

    题目描述 Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个 代号ai和美味度di,i,不同种类的寿司有可能使用相同的代号.每种寿司的份数都是无 ...

  8. bzoj4873(最大权闭合子图)

    今天学了最大权闭合子图..然后找了这道题,发现完全不会..... 看了题解发现这种有诸如选了一个就一定要选另外的一些的限制又要求最优值的题有的可以转化成最大权闭合子图, 这个题我们首先想到不会选相交的 ...

  9. bzoj千题计划265:bzoj4873: [六省联考2017]寿司餐厅

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 选a必选b,a依赖于b 最大权闭合子图模型 构图: 1.源点 向 正美味度区间 连 流量为 美 ...

  10. bzoj4873 [Shoi2017]寿司餐厅

    Input 第一行包含两个正整数n,m,分别表示这家餐厅提供的寿司总数和计算寿司价格中使用的常数. 第二行包含n个正整数,其中第k个数ak表示第k份寿司的代号. 接下来n行,第i行包含n-i+1个整数 ...

随机推荐

  1. 洛谷 2187 小Z的笔记

    [题解] DP.  设f[i]表示前i个字母,保留第i个字母,最多可以保留多少个字母:设g[i]为当前字母为i的位置对应的f的最大值. 转移方程就是f[i]=max(f[i], g[j]+1) (j与 ...

  2. HDU 5458 Stability

    Stability Time Limit: 2000ms Memory Limit: 102400KB This problem will be judged on HDU. Original ID: ...

  3. Linux环境下使用VSCode编译makefile文件的注意事项

    Linux环境下使用VSCode编译makefile文件的注意事项 首先安装C/C++的两个依赖 在debug,launch会自动的生成下方的launch.json launch.json { // ...

  4. hdu 1251简单字典树

    #include<stdio.h> #include<iostream> #include<string.h> using namespace std; struc ...

  5. MySQL:视图、触发器、存储过程、事务

    视图: 视图,虚拟表 创建虚拟表: # 语法: # create view 虚拟表名称 as 虚拟表; create view course_and_teacher as select * from ...

  6. 对付 MySQL 的死连接,Sleep的进程的来源探究[转]

    当前的连接数:mysql> show status like '%Threads_connected%';+-------------------+-------+| Variable_name ...

  7. hdu - 2851 Lode Runner (最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=2851 首先有n层,每层的路径都有一个起点和终点和对应的危险值,如果某两层之间有交集,就能从这一层上到另外一层,不 ...

  8. symfony 参考

    多语言存数据库 http://blog.elendev.com/development/php/symfony/use-a-database-as-translation-provider-in-sy ...

  9. server证书安装配置指南(Tomcat 6)

    一.   生成证书请求   1.  安装JDK 安装Tomcat须要JDK支持. 假设您还没有JDK的安装.则能够參考 Java SE Development Kit (JDK) 下载. 下载地址: ...

  10. 请问这个「 (?<=<(\w+)>).*(?=<\/\1>) 」正则表达式是什么意思呢?

    问题:https://www.zhihu.com/question/26480812  (?<=<(\w+)>).*(?=<\/\1>) ---------------- ...