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. python——文件管理

    文件操作分为读.写.修改 一.读文件 f = open(file='D:/工作日常/兼职白领学生空姐模特护士联系方式.txt',mode='r',encoding='utf-8') data = f. ...

  2. 在linux服务器上搭建Struts2项目运行环境

    服务器上工作: 首先要先装java https://www.cnblogs.com/lamp01/p/8932740.html 然后装好tomcat https://www.cnblogs.com/y ...

  3. selenium IDE脚本编辑与操作

    1.编辑一行命令 在Table标签下选中某一行命令,命令由command.Target.value三部分组成.可以对这三部分内容那进行编辑. 然后右击这行命令,选择“Execute this comm ...

  4. c#读取MySQL数据表中的内容

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. [codevs3044][POJ1151]矩形面积求并

    [codevs3044][POJ1151]矩形面积求并 试题描述 输入n个矩形,求他们总共占地面积(也就是求一下面积的并) 输入 可能有多组数据,读到n=0为止(不超过15组) 每组数据第一行一个数n ...

  6. hdu 4431 绝对值之和最小公式

    /* 普通的二分不好写,反正我没写出来,这题核心需要求出绝对值最小公式 sum=|x+10|+|x+5|+|x+1|+|x-2|+|x-6|;sumx[1]=-10;sumx[2]=-15;sumx[ ...

  7. jsp页面根据json数据动态生成table

    根据需求由于不同的表要在同一个jsp展示,点击某个表名便显示某张表内容,对于java后台传给jsp页面的json形式的数据是怎么动态生成table的呢? 找了好久,终于找到某位前辈的答案,在此表示衷心 ...

  8. 【NOIP2017练习】函数变换(DP,dfs)

    题意: 思路: 极限步数大概不会超过30 ; ..max,..]of longint; eul:..max]of longint; cas,v,n,k,i,ans,j:longint; functio ...

  9. C#高级编程第9版 第一章 .NET体系结构 读后笔记

    .NET的CLR把源代码编译为IL,然后又把IL编译为平台专用代码. IL总是即时编译的,这一点的理解上虽然明白.当用户操作C#开发的软件时,应该是操作已经编译好的程序.那么此时安装在客户机上的程序是 ...

  10. maven的安装与环境变量配置

    1.下载maven 地址:http://maven.apache.org/download.cgi 点击下载 apache-maven-3.2.1-bin.zip. 2.安装配置,假设maven 解压 ...