[最大权闭合子图] BZOJ4873: [Shoi2017] 寿司餐厅
2017-12-19 18:42
761 查看
di,j 向 di+1,j 和 di,j−1 连边,就是一个最大权闭合子图模型了…
每个编号新建一个点,然后 di,i 向 ai 连边就行了
每个编号新建一个点,然后 di,i 向 ai 连边就行了
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int N=100010,inf=1<<29; int n,m,S,T,a ,cnt=1,G ,d[110][110],g[110][110],v[1010],t; struct edge{ int t,nx,f; }E[N<<2]; inline void link(int x,int y,int f){ E[++cnt].t=y; E[cnt].nx=G[x]; E[cnt].f=f; G[x]=cnt; E[++cnt].t=x; E[cnt].nx=G[y]; E[cnt].f=0; G[y]=cnt; } queue<int> Q; int dis ,cur ; inline bool bfs(){ while(!Q.empty()) Q.pop(); for(int i=S;i<=T;i++) dis[i]=-1; dis[S]=0; Q.push(S); while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=G[x];i;i=E[i].nx) if(E[i].f && !~dis[E[i].t]){ dis[E[i].t]=dis[x]+1; if(E[i].t==T) return true; Q.push(E[i].t); } } return false; } int dfs(int x,int f){ if(x==T || !f) return f; int used=0,w; for(int &i=cur[x];i;i=E[i].nx) if(E[i].f && dis[E[i].t]==dis[x]+1){ w=dfs(E[i].t,min(f-used,E[i].f)); E[i].f-=w; E[i^1].f+=w; if((used+=w)==f) return used; } if(!used) dis[x]=-1; return used; } int main(){ scanf("%d%d",&n,&m); T=1; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(!v[a[i]]) v[a[i]]=T++; } for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) scanf("%d",&d[i][j]),g[i][j]=T++; for(int i=1;i<=1000;i++) if(v[i]) link(v[i],T,m*i*i); int ans=0; for(int i=1;i<=n;i++) for(int j=i;j<=n;j++){ if(i==j){ if(d[i][j]-a[i]>=0) link(S,g[i][j],d[i][j]-a[i]),ans+=d[i][j]-a[i]; else link(g[i][j],T,a[i]-d[i][j]); link(g[i][j],v[a[i]],inf); } else{ if(d[i][j]>=0) link(S,g[i][j],d[i][j]),ans+=d[i][j]; else link(g[i][j],T,-d[i][j]); link(g[i][j],g[i+1][j],inf); link(g[i][j],g[i][j-1],inf); } } while(bfs()){ for(int i=S;i<=T;i++) cur[i]=G[i]; ans-=dfs(S,inf); } printf("%d\n",ans); return 0; }
相关文章推荐
- 【最大权闭合子图】bzoj4873 [Shoi2017]寿司餐厅
- [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)
- BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图
- 【bzoj4873】[Shoi2017]寿司餐厅 最大权闭合图
- bzoj 4873: [Shoi2017]寿司餐厅 最大权闭合子图
- BZOJ 4873: [Shoi2017]寿司餐厅 (最大权闭合子图)
- BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图
- [BZOJ4873]六省联考寿司餐厅(最大权闭合子图)
- 【BZOJ4873】[Shoi2017]寿司餐厅 最大权闭合图
- bzoj4873: [Shoi2017]寿司餐厅(网络流)
- [最大权闭合子图] BZOJ 4873 [Shoi2017]寿司餐厅
- BZOJ4873 [Shoi2017]寿司餐厅 【最大权闭合子图】
- [最大权闭合子图][最小割] BZOJ 4873:寿司餐厅
- bzoj4873: [Shoi2017]寿司餐厅
- bzoj 4873 [Shoi2017]寿司餐厅
- BZOJ 4873 寿司餐厅(最大权闭合图 网络流)
- bzoj 4823: [Cqoi2017]老C的方块【最大权闭合子图】
- BZOJ_1391_[Ceoi2008]order_最大权闭合子图
- 【BZOJ1497】【codevs1789】最大获利,网络流之最大权闭合子图
- bzoj 1497: [NOI2006]最大获利-----------算法模板[最大权闭合子图]&省选计划系列