bzoj4873(最大权闭合子图)
今天学了最大权闭合子图。。然后找了这道题,发现完全不会。。。。。
看了题解发现这种有诸如选了一个就一定要选另外的一些的限制又要求最优值的题有的可以转化成最大权闭合子图,
这个题我们首先想到不会选相交的区间,
因为那样代价多算了一遍又不会增加价值。然后就是选一些区间,就有了一个经典的限制:
如果选了区间[i,j]就一定要选[i+1,j]和[i,j-1];
关于代价的处理我们可以对每一个[i,i]连到一个权值为-m*a[i]*a[i]的点,然后把每个[i,i]减去a[i],这里关键是把题意理解好就行了;
//图论模型,难在建图;
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=,maxa=,inf=1e9;
int D[maxn*maxn+maxa],t=,n,m,S,T,sum,last[maxn*maxn+maxa],a[maxn],d[maxn][maxn],num[maxn][maxn];
struct edg{
int nxt,to,f;
}e[maxn*maxn*+maxa*];
void add(int x,int y,int z){
++t;e[t].nxt=last[x];last[x]=t;e[t].to=y;e[t].f=z;
++t;e[t].nxt=last[y];last[y]=t;e[t].to=x;e[t].f=;
}
int q[maxn*maxn+maxa],head,tail;
int bfs(){
head=tail=;memset(D,-,sizeof(D));
q[++tail]=S;D[S]=;
while(head<tail){
int u=q[++head];
for(int i=last[u];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].f&&D[v]==-){
D[v]=D[u]+;q[++tail]=v;
}
}
}
return D[T]!=-;
}
int dfs(int x,int h){
if(x==T){return h;}
int tmp=,cp;
for(int i=last[x];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].f&&D[v]==D[x]+){
cp=dfs(v,min(h-tmp,e[i].f));
e[i].f-=cp;e[i^].f+=cp;tmp+=cp;
}
}
if(!tmp)D[x]=-;
return tmp;
}
int dinic(){
int pp,res=;
while(bfs()){
while(pp=dfs(S,inf))res+=pp;
}
return res;
}
int main(){
cin>>n>>m;
for(int i=;i<=n;++i)scanf("%d",&a[i]);
S=;T=S+maxa+n*n+;
for(int i=;i<=maxa;++i)add(S+i,T,m*i*i);
int cnt=;
for(int i=;i<=n;++i)
for(int j=i;j<=n;++j){
scanf("%d",&d[i][j]);
++cnt,num[i][j]=S+maxa+cnt;
}
for(int i=;i<=n;++i)
for(int j=i;j<=n;++j){
if(i==j){
d[i][j]-=a[i];
add(num[i][j],S+a[i],inf);
}
else{
add(num[i][j],num[i+][j],inf);
add(num[i][j],num[i][j-],inf);
}
if(d[i][j]>){
sum+=d[i][j];
add(S,num[i][j],d[i][j]);
}
else{
add(num[i][j],T,-d[i][j]);
}
}
printf("%d",sum-dinic());
//system("pause");
return ;
}
bzoj4873(最大权闭合子图)的更多相关文章
- BZOJ4873 [Shoi2017]寿司餐厅 【最大权闭合子图】
题目链接 BZOJ4873 题解 题意很鬼畜,就可以考虑网络流[雾] 然后就会发现这是一个裸的最大权闭合子图 就是注意要离散化一下代号 #include<algorithm> #inclu ...
- 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 369 Solved: 256[Submit][Status ...
- BZOJ4873[Shoi2017]寿司餐厅——最大权闭合子图
题目描述 Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个 代号ai和美味度di,i,不同种类的寿司有可能使用相同的代号.每种寿司的份数都是无 ...
- [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 490 Solved: 350[Submit][Status ...
- bzoj4873: [Shoi2017]寿司餐厅(最大权闭合子图)
4873: [Shoi2017]寿司餐厅 大难题啊啊!!! 题目:传送门 题解:一眼题是网络流,但还是不会OTZ,菜啊... %题解... 最大权闭合子图!!! 好的...开始花式建边: 1.对于每个 ...
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- HDU 3879 Base Station(最大权闭合子图)
经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...
- [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
- HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...
随机推荐
- 转 C++函数返回值,你必须注意的问题
归根结底,C++所面临的问题要求它提供各种各样的机制以保证性能,也许,这辈子也见不到C++能安全有效的自己进行内存垃圾回收..... 老程序猿都会提醒菜鸟,注意函数的返回值,因为,很可能,你的函数返回 ...
- 78k的text 文件,输出到textbox 竟然用了20几秒的原因
开始查资料以为是io读取的,磁盘速度慢的之类的,后来一想,text 又不是几十万条数据,才那么两千行,咋回事. 原来是循环中不停的修改textbox值导致的. 总结: 比较大的运算,特别是大的循环, ...
- Liunjx 文件
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...
- Android.API.Context.getFilesDir()
1. Context.getFilesDir() http://developer.android.com/reference/android/content/Context.html#getFile ...
- How to use bmw icom a2
Lan Connect Operation Details 1. Connect the LAN cable to ICOM A1/ICOM A2, another side to laptop LA ...
- JavaScript中对数据库表中某一个字段进行赋值
场景如下,通过下拉列表选择一个选项(如“启用”和“不启用”),启用用0表示,不启用用1表示. enableFlag是表中一个字段,我猜date:后面就是对该字段的赋值.
- netty4初步使用
文件 D:\jp\netty\NtServer.java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Chan ...
- 三连击(NOIP1998)
题目链接:三连击 典型的打表题,但cgg今天不是教你怎么打表的,而是教你正解. 这题方法多样,比如递归求解也行,反正数据也不大. 在这里我提供另一种思路,我们枚举第一个数,即最小的一个数,然后分解它以 ...
- Java第14章笔记
Java 中无参无返回值和带参带返回值习题 编写一个 Java 程序,实现输出学生年龄的最大值 要求: 1. 要求通过定义无参带返回值的方法来实现,返回值为最大年龄 2. 方法中将学生年龄保存在数组 ...
- 20 模块之 re subprocess
re: 什么是正则: 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 ...