AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2879

这题codevs上也有,不过数据不同:http://codevs.cn/problem/1935/

如果你觉得你的程序跑得很快,那么你可以交codevs,如果你觉得你的程序可能是错的,那么请你交BZOJ

BZOJ数据貌似厉害一些?不过BZOJ时限也放得开些。

这题就是上题的升级版,在修车的基础上,数据很大,所以需要通过动态加边来使其变快。

因为上题也分析到了,只有厨师走完短的路,才会走长的,那么如果没走短的路,我长的路留在这里只是增加spfa的复杂度。

然后动态加边就可以了。

这个题刚开始的思路是错的,就是我在动态加边的同时,可以动态加点,但这样需要一个数组记下这是哪个厨师,也要记下这是厨师的第几个菜。

但是发现如果我的费用流需要退流的话,我记录第几个菜的数组需要-1,但是我做不到,这会导致这个点被重复算几次,然后就比答案小了。

所以必须确定下位置,这样的话,你就不会重复的添加点了,最多重复添加相同意义的边,而因为流量限制,这条边没有实际意义。

不过这样的话,速度就会变慢...

好慢啊好慢啊...

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;const int maxn=50;
const int maxm=110;
const int maxp=100010;
const int INF=0x3f3f3f3f;struct Node{int data,next,low,cost;
}node[maxp*maxn*2];#define now node[point].data
#define www node[point].low
#define ccc node[point].cost
#define then node[point].nextint n,m,cnt,ans;
int s,t,Idex,tot;
int head[maxp];
int c[maxp],ind[maxp],ink[maxp];
int dis[maxp],pre[maxp];
int a[maxm][maxm];
bool inq[maxp];
deque<int >q;void add(int u,int v,int w,int c){node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;node[cnt].cost=c;head[u]=cnt++;node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=0;node[cnt].cost=-c;head[v]=cnt++;
}bool SPFA(){int x,Low=INF,ta,tb;memset(dis,0x3f,sizeof(dis));q.push_back(s);dis[s]=0;pre[s]=pre[t]=-1;while(!q.empty()){x=q.front();q.pop_front();inq[x]=false;for(int point=head[x];point!=-1;point=then)if(www && dis[now]>dis[x]+ccc){dis[now]=dis[x]+ccc;pre[now]=point^1;if(!inq[now]){inq[now]=true;if(q.empty() || dis[q.front()]>dis[now])q.push_front(now);elseq.push_back(now);}}}if(pre[t]<0) return false;for(int point=pre[t];point!=-1;point=pre[now]){if(now==s){x=node[point^1].data;ta=(x-1)/tot+1;tb=x%tot+1;}Low=min(Low,min(Low,node[point^1].low));}for(int point=pre[t];point!=-1;point=pre[now])node[point^1].low-=Low,www+=Low;for(int i=1;i<=m;i++)add((ta-1)*tot+tb,n*tot+i,1,tb*a[ta][i]);ans+=Low*dis[t];return true;
}int main(){
#ifndef ONLINE_JUDGEfreopen("2879.in","r",stdin);freopen("2879.out","w",stdout);
#endifscanf("%d%d",&m,&n);for(int i=1;i<=m;i++) scanf("%d",&c[i]),tot+=c[i];for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)scanf("%d",&a[j][i]);t=n*tot+m+1;for(int i=s;i<=t;i++) head[i]=-1;for(int i=1;i<=n*tot;i++) add(s,i,1,0);for(int i=1;i<=m;i++)add(n*tot+i,t,c[i],0);for(int i=1;i<=n;i++)for(int k=1;k<=m;k++)add((i-1)*tot+1,n*tot+k,1,a[i][k]);while(SPFA());printf("%d",ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/Robert-Yuan/p/5228981.html

BZOJ2879 [Noi2012]美食节相关推荐

  1. bzoj2879: [Noi2012]美食节

    bzoj2879: [Noi2012]美食节 题意 有n(<=40)道菜,第i道菜被点了pi(∑p<=800)次;有m(<=100)个人,第i个人做第j道菜用时tij(<=10 ...

  2. [BZOJ2879] [Noi2012] 美食节 (费用流 动态加边)

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  3. [BZOJ2879][Noi2012]美食节(费用流)

    Address 洛谷P2050 BZOJ2879 LOJ#2674 Solution 一看发现和 SCOI2007 修车 是一样的. 这里再说一下建图: 把每个厨师拆成 ∑ i = 1 n p i \ ...

  4. 「BZOJ2879」[Noi2012]美食节

    这道题就是 「BZOJ1070」[SCOI2007]修车 的加强版 如果一开始把全部边连上会T 优化的方法是只连用到过和下一次增广可能用到的边. 1 #include<bits/stdc++.h ...

  5. 2879: [Noi2012]美食节

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  6. [NOI2012]美食节——费用流(带权二分图匹配)+动态加边

    题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...

  7. noi2012美食节

    描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可 ...

  8. [NOI2012]美食节(费用流)

    题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...

  9. NOI2012 美食节

    http://www.lydsy.com/JudgeOnline/problem.php?id=2879 费用流. 我们发现,每个厨师做的倒数第k道菜对总等待时间的贡献为k*做这道菜的时间. 将每个厨 ...

  10. P2050 [NOI2012]美食节

    传送门 看一眼,这不是修车原题吗? 把厨师拆成 $n*m$ 个点,第 $k$ 种菜连向第 $i$ 个厨师的第 $j$ 个点表示第 $i$ 个厨师倒数做的第 $j$ 个菜是 $k$ 可以发现厨师 $i$ ...

最新文章

  1. pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装
  2. legend3---lavarel多对多模型操作实例
  3. 洛谷——P1549 棋盘问题(2)
  4. Serverless Kubernetes:理想,现实与未来
  5. h5+js视频播放器控件
  6. 揭示垃圾收集暂停的时间长度
  7. oracle 10g dsg,【ORACLE】relink oracle 10g 数据库
  8. 有linux服务器用来干什么用的,linux集群能干什么
  9. golang中包互相引用的解决方法
  10. 英语中的完成时态的比较
  11. HTML注册页面代码
  12. 「Web全栈工程师的自我修养」读后感
  13. python补考卷子_1819级计算机专业补考(python程序设计)_章节测验,期末考试,慕课答案查询公众号...
  14. 图片转cad用什么软件?转换有技巧
  15. Word修改默认英文字体为Times New Roman
  16. 手机微信中对方正在输入...,不显示有4种原因,还能永不显示
  17. python转义字符/a---响铃
  18. paper fast review :Deep Residual Shrinkage....
  19. jQuery框架介绍
  20. 小程序canvas文字信息绘制图片,模拟器正常保存图片,真机无法保存图片报错downloadFile:fail downloadFile protocol must be http or https

热门文章

  1. An Introduction to Unstructured Mesh Generation Methods and Softwares for Scientific Computing
  2. 正确使用auto_ptr智能指针
  3. P5441 【XR-2】伤痕
  4. scanf 与 scanf_s
  5. 【jsp】JSTL标签大全详解
  6. hdu1501 Zipper--DFS
  7. STC单片机串口输出ADXL335角度值
  8. 【转】C#获取用户桌面等特殊系统路径
  9. [转]SDI模式下,在视图中添加按钮
  10. 【转】Java杂谈(九)--Struts