1. 程式人生 > >【BZOJ】4873: [Shoi2017]壽司餐廳

【BZOJ】4873: [Shoi2017]壽司餐廳

str 優化 != DC pre space gpo spa algorithm

【題目】#2146. 「SHOI2017」壽司餐廳

【題意】給定n種壽司的代號,取區間[i,j]的壽司收益是d[i,j]和所有子區間的d,吃了c(c>0)種代號x的壽司的代價是mx^2+cx,給定n,m和矩陣d(有負數!),求最大收益。n<=100。

【算法】最大權閉合子圖

【題解】開始考慮每個區間建一個收益點向區間內的壽司連邊,然後對每個代號新建一個點權為-mx^2的點,每種壽司壽司連向代號點,這樣就是求最大權閉合子圖了。

但是這樣邊數是n^3,可能過不了。

考慮優化,區間$[i,j]$只需要連向$[i,j-1]$和$[i+1,j]$就可以了,所有區間$[i,i]$的點權為d[i,i]-a[i],這樣邊數只有n^2,復雜度O(n^4)。

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,S,T,a[110];
namespace nwf{
    const int maxn=20010,maxm=40010;
    int tot=1,first[maxn],d[maxn],q[maxn],cur[maxn];
    struct edge{int v,f,from;}e[maxm*2];
    void insert(int
u,int v,int f){ tot++;e[tot].v=v;e[tot].f=f;e[tot].from=first[u];first[u]=tot; tot++;e[tot].v=u;e[tot].f=0;e[tot].from=first[v];first[v]=tot; } bool bfs(){ memset(d,-1,sizeof(d)); d[S]=0; int head=0,tail=1;q[head]=S; while(head<tail){
int x=q[head++]; for(int i=first[x];i;i=e[i].from)if(e[i].f&&d[e[i].v]==-1){ d[e[i].v]=d[x]+1; q[tail++]=e[i].v; } } return ~d[T]; } int dfs(int x,int a){ if(x==T||a==0)return a; int flow=0,f; for(int& i=cur[x];i;i=e[i].from) if(e[i].f&&d[e[i].v]==d[x]+1&&(f=dfs(e[i].v,min(a,e[i].f)))){ e[i].f-=f;e[i^1].f+=f; flow+=f;a-=f; if(a==0)break; } return flow; } int dinic(){ int ans=0; while(bfs()){ for(int i=S;i<=T;i++)cur[i]=first[i]; ans+=dfs(S,inf); } return ans; } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); S=0;T=n*n+1001; int ans=0; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ int u;scanf("%d",&u); if(i!=j){ nwf::insert((i-1)*n+j,i*n+j,inf),nwf::insert((i-1)*n+j,(i-1)*n+j-1,inf); if(u>0)nwf::insert(S,(i-1)*n+j,u),ans+=u;else nwf::insert((i-1)*n+j,T,-u);// } else if(u-a[i]>0)nwf::insert(S,(i-1)*n+j,u-a[i]),ans+=u-a[i];else nwf::insert((i-1)*n+j,T,a[i]-u); } } for(int i=1;i<=1000;i++){ nwf::insert(n*n+i,T,i*i*m); for(int j=1;j<=n;j++)if(a[j]==i)nwf::insert((j-1)*n+j,n*n+i,inf); } printf("%d",ans-nwf::dinic()); return 0; }
View Code

【BZOJ】4873: [Shoi2017]壽司餐廳