4873: [Shoi2017]寿司餐厅

大难题啊啊!!!

题目:传送门

题解:一眼题是网络流,但还是不会OTZ,菜啊...

    %题解...

   最大权闭合子图!!!

   好的...开始花式建边:

   1、对于每个区间,我们把它看成一个点,按照权值正负连接源点或汇点(最大权闭合子图的套路)

     2、对于所有的寿司类型k[i],各自开一个点,向ed连边,流量为m*k[i]*k[i];

     3、对于1~n的每个寿司,向它的所属类型连边,流量为无限大;再向ed连边,流量为e[i]。

     4、对于所有的区间i~j,向(i+1,j)和(i,j-1)连边,因为区间具有包含性。

    WA了...再%题解...

     漏了第五种情况:

     5、对于所有区间,向区间内所有的点连边,流量为无限大,表示必须选对应的寿司才能选这个区间QWQ

  跑网络流。。。

蒟蒻的代码(丑的一匹,慎点):

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define qread(x)x=read();
using namespace std;
typedef long long LL;
inline int read()
{
int f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
struct node
{
int x,y,c,next,other;
}a[];int last[],len;
int st,ed,n,m;
void ins(int x,int y,int c)
{
int k1,k2;
len++;k1=len;
a[len].x=x;a[len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len; len++;k2=len;
a[len].x=y;a[len].y=x;a[len].c=;
a[len].next=last[y];last[y]=len; a[k1].other=k2;
a[k2].other=k1;
}
int list[],h[];
int head,tail;
bool bfs()
{
memset(h,,sizeof(h));h[st]=;
list[]=st;head=;tail=;
while(head!=tail)
{
int x=list[head];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]== && a[k].c>)
{
h[y]=h[x]+;
list[tail++]=y;
}
}
head++;
}
if(h[ed]>)return true;
return false;
}
int findflow(int x,int flow)
{
if(x==ed)return flow;
int s=,t;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]==h[x]+ && a[k].c> && flow>s)
{
t=findflow(y,min(a[k].c,flow-s));
s+=t;
a[k].c-=t;a[a[k].other].c+=t;
}
}
if(s==)h[x]=;
return s;
}
int e[];
int d[][];
int id1[][],id2[];
bool v[];
int jb()
{
memset(v,false,sizeof(v));
LL sum=,cnt=;
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
id1[i][j]=++cnt; for(int i=;i<=n;i++)
if(v[e[i]]==)
{
v[e[i]]=true;
id2[e[i]]=++cnt;
} ed=cnt+n+;
memset(v,false,sizeof(v));
for(int i=;i<=n;i++)
if(v[e[i]]==)
{
v[e[i]]=true;
ins(id2[e[i]],ed,m*e[i]*e[i]);//种类的花费,和ed连边
}
for(int i=;i<=n;i++)
{
ins(cnt+i,id2[e[i]],);
ins(cnt+i,ed,e[i]);
}
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
{
if(d[i][j]>)
{
sum+=d[i][j];
ins(st,id1[i][j],d[i][j]);
ins(id1[i][j],cnt+i,);
ins(id1[i][j],cnt+j,);
}
else if(d[i][j]<)
{
ins(id1[i][j],ed,-d[i][j]);
ins(id1[i][j],cnt+i,);
ins(id1[i][j],cnt+j,);
}
if(i!=j)
{
ins(id1[i][j],id1[i][j-],);
ins(id1[i][j],id1[i+][j],);
}
}
return sum;
}
int main()
{
qread(n);qread(m);
for(int i=;i<=n;i++)qread(e[i]);
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
qread(d[i][j]);
st=;
LL sum=jb();
/*
for(int i=1;i<=len;i++)
if(a[i].x==0)
printf("%d %d\n",a[i].y,a[i].c);
printf("\n");
for(int i=1;i<=len;i++)
if(a[i].y==ed)
printf("%d %d\n",a[i].x,a[i].c);
*/
int ans=;
while(bfs())ans+=findflow(st,);
printf("%lld\n",sum-ans);
return ;
}

bzoj4873: [Shoi2017]寿司餐厅(最大权闭合子图)的更多相关文章

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

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

  2. [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)

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

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

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

  4. [HEOI2017] 寿司餐厅 + 最大权闭合子图的总结

    Description 太长了自己看叭 点这里! Solution 先学一波什么叫最大权闭合子图. 先要明白什么是闭合子图,闭合子图就是给定一个有向图,从中选择一些点组成一个点集V.对于V中任意一个点 ...

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

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

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

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

  7. bzoj4873 [Shoi2017]寿司餐厅

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

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

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

  9. bzoj4873: [Shoi2017]寿司餐厅(最小割)

    传送门 大佬们是怎么一眼看出这是一个最大权闭合子图的……大佬好强->这里 1.把所有区间$(i,j)$看成一个点,如果权值大于0,则从$S$向他连边,容量为权值,否则从它向$T$连边,容量为权值 ...

随机推荐

  1. 洛谷 P1825 [USACO11OPEN]玉米田迷宫Corn Maze

    P1825 [USACO11OPEN]玉米田迷宫Corn Maze 题目描述 This past fall, Farmer John took the cows to visit a corn maz ...

  2. 宿主机mac os无法连接到虚拟机centos

    宿主机: Mac OS 10.9.2 虚拟机: [root@localhost ~]# cat /etc/redhat-release CentOS release 6.4 (Final) [root ...

  3. CF 447B(DZY Loves Strings-贪心)

    B. DZY Loves Strings time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. 软工视频总结Part Three

    软件需求分析 任务 解决目标系统"做什么"问题 深入描写叙述软件的功能和性能 确定软件涉及到的约束和软件接口 定义软件的其它有效需求 特点 一致性.完整性.限时性.有效性.可验证性 ...

  5. 三种SVM的对偶问题

    一.SVM原问题及要变成对偶问题的解决办法 对于SVM的,我们知道其终于目的是求取一分类超平面,然后将新的数据带入这一分类超平面的方程中,推断输出结果的符号,从而推断新的数据的正负. 而求解svm分类 ...

  6. 【算法】prim算法(最小生成树)(与Dijkstra算法的比较)

    最小生成树: 生成树的定义:给定一个无向图,如果它的某个子图中任意两个顶点都互相连通并且是一棵树,那么这棵树就叫做生成树.(Spanning Tree) 最小生成树的定义:在生成树的基础上,如果边上有 ...

  7. <%=%>、<%%>、<%@%>、<%#%>的区别

    1.<%= %> 里面放变量名,获取后台的变量值,直接输入变量到页面上,里面放的变量名,未经过encode eg: 后台: seession["ab"]=ab; 前台: ...

  8. ASP调用WebService转化成JSON数据,附json.min.asp

    首先定义SOAP数据,然后创建HTTP对象,然后使用POST提交,获取状态码为200,就说明调用成功,再进行下一步操作…… <!--#Include virtual="/Include ...

  9. hiho160周 - 字符串压缩,经典dp

    题目链接 小Hi希望压缩一个只包含大写字母'A'-'Z'的字符串.他使用的方法是:如果某个子串 S 连续出现了 X 次,就用'X(S)'来表示.例如AAAAAAAAAABABABCCD可以用10(A) ...

  10. 模块-- HASH

    模块 HASH   一 MD5 import hashlib h = hashlib.md5() # In [237]: h # Out[237]: <md5 HASH object @ 0x0 ...