修车加强版。发现每个厨师拆成p个点太浪费了,毕竟总共用到的才p个点。于是从下往上一个一个加,加到满流就停。

论动态加点费用流的正确姿势......

我自己加总是出现负环...我是每次加一整层,然后跑完这一层再加下一层,这样会显而易见的出现负环......

然后我们发现如果每增广一流量就加边就不会出现这种毒瘤现象,因为每次加的一定比增广的劣......

注意一定要动态开点,不能只用一个点代表厨师。否则可能出现厨师的第一次给了多个菜的情况...

  1. #include <bits/stdc++.h>
  2.  
  3. const int N = , INF = 0x7f7f7f7f;
  4.  
  5. struct Edge {
  6. int nex, v, c, len;
  7. Edge(int Nex = , int V = , int C = , int Len = ) {
  8. nex = Nex;
  9. v = V;
  10. c = C;
  11. len = Len;
  12. }
  13. }edge[]; int tp = ;
  14.  
  15. int e[N], lm, now[N], pre[N], flow[N], p[N], cnt[N], d[N];
  16. int val[][];
  17. bool vis[N];
  18. std::queue<int> Q;
  19.  
  20. inline void add(int x, int y, int z, int w) {
  21. edge[++tp] = Edge(e[x], y, z, w);
  22. e[x] = tp;
  23. edge[++tp] = Edge(e[y], x, , -w);
  24. e[y] = tp;
  25. return;
  26. }
  27.  
  28. inline bool SPFA(int s, int t) {
  29. memset(d + , 0x7f, lm * sizeof(int));
  30. vis[s] = ;
  31. flow[s] = INF;
  32. d[s] = ;
  33. Q.push(s);
  34. while(!Q.empty()) {
  35. int x = Q.front();
  36. Q.pop();
  37. vis[x] = ;
  38. for(int i = e[x]; i; i = edge[i].nex) {
  39. int y = edge[i].v;
  40. if(d[y] > d[x] + edge[i].len && edge[i].c) {
  41. d[y] = d[x] + edge[i].len;
  42. //printf("%d -> %d \n", x, y);
  43. flow[y] = std::min(flow[x], edge[i].c);
  44. pre[y] = i;
  45. if(!vis[y]) {
  46. vis[y] = ;
  47. Q.push(y);
  48. }
  49. }
  50. }
  51. }
  52. return d[t] < INF;
  53. }
  54.  
  55. inline void update(int s, int t) {
  56. int f = flow[t];
  57. while(t != s) {
  58. int i = pre[t];
  59. edge[i].c -= f;
  60. edge[i ^ ].c += f;
  61. t = edge[i ^ ].v;
  62. }
  63. return;
  64. }
  65.  
  66. int main() {
  67.  
  68. int n, m, tot = ;
  69. scanf("%d%d", &n, &m);
  70. lm = n;
  71. int s = ++lm;
  72. int t = ++lm;
  73. for(int i = ; i <= n; i++) {
  74. scanf("%d", &p[i]);
  75. add(s, i, p[i], );
  76. tot += p[i];
  77. }
  78. for(int i = ; i <= n; i++) {
  79. for(int j = ; j <= m; j++) {
  80. scanf("%d", &val[i][j]);
  81. }
  82. }
  83. /// sol
  84. for(int i = ; i <= m; i++) {
  85. add(++lm, t, , );
  86. cnt[i] = ;
  87. now[i] = tp - ;
  88. for(int j = ; j <= n; j++) {
  89. add(j, lm, , val[j][i]);
  90. }
  91. }
  92.  
  93. int ans = ;
  94. while(tot) {
  95. //printf("tot = %d ans = %d \n", tot, ans);
  96. SPFA(s, t);
  97. ans += d[t] * flow[t];
  98. tot -= flow[t];
  99. update(s, t);
  100. for(int j = ; j <= m; j++) {
  101. if(edge[now[j]].c) continue;
  102. add(++lm, t, , );
  103. now[j] = tp - ;
  104. cnt[j]++;
  105. for(int i = ; i <= n; i++) {
  106. add(i, lm, , cnt[j] * val[i][j]);
  107. }
  108. break;
  109. }
  110. }
  111.  
  112. printf("%d\n", ans);
  113. return ;
  114. }

AC代码

洛谷P2050 美食节的更多相关文章

  1. Solution -「NOI 2012」「洛谷 P2050」美食节

    \(\mathcal{Description}\)   Link.   美食节提供 \(n\) 种菜品,第 \(i\) 种的需求量是 \(p_i\),菜品由 \(m\) 个厨师负责制作,第 \(j\) ...

  2. 洛谷P2050 [NOI2012]美食节

    动态加边网络流 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...

  3. 洛谷$P2050\ [NOI2012]$美食节 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 昂开始看到$jio$得,哇长得好像上一题嗷$QwQ$ 然后仔细康康数据范围,发现,哇好像要几万个点,,,显然就$GG$了 但感$jio$思路方向好对的亚子? ...

  4. 【洛谷2050】 [NOI2012]美食节(费用流)

    大家可以先看这道题目再做! SCOI2007修车 传送门 洛谷 Solution 就和上面那道题目一样的套路,但是发现你会获得60~80分的好成绩!!! 考虑优化,因为是SPFA,所以每一次只会走最短 ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. day 7-17 多表查询

    一. 准备表 #部门表 create table dep( id int, name varchar(20) ); #员工表 create table emp( id int primary key ...

  2. python之路--内置函数03

    一 . 正则表达式 匹配字符串 元字符 . 除了换行 \w 数字, 字母, 下划线 \d 数字 \s 空白符 \n \t \b 单词的边界 \W 非xxx \D \S [ ] 字符组 or的关系 [^ ...

  3. python之路-列表、元组、range

    一 . 列表 # 列表的定义 列表就是能装对象的对象 在python中用[ ]来描述列表,内部元素用逗号隔开,对数据类型没有要求 索引和切片 lst = ["天龙八部", &quo ...

  4. python数据结构与算法第七天【链表】

    1.链表的定义 如图: 注意: (1)线性表包括顺序表和链表 (2)顺序表是将元素顺序地存放在一块连续的存储区里 (3)链表是将元素存放在通过链构造的存储快中 2. 单向链表的实现 #!/usr/bi ...

  5. 数据驱动-参数化(Parameters)

    在录制程序运行的过程中,Vugen(脚本生成器)自动生成了脚本以及录制过程中实际用到的数据.在这个时候,脚本和数据是混在一起的. 在登录操作中,很明显xpj与123123是填入的数据,如果Contro ...

  6. Python——组图Canvas控制参数

    一.参数说明 background(bg) : 背景色; foreground(fg): 前景色; borderwidth :组件边框宽度: width  : 组件宽度: height  : 高度; ...

  7. MySQL——安装、配置、启动服务、

    1.环境变量配置 将启动连接,加入环境变量中. mysqld  :启动服务端 msysql -u 用户名 -p 密码 : 启动客户端 2.windows服务:一直在运行中 E:\wupeiqi\mys ...

  8. SQL 函数NULLIF、NULL、ISNULL、COALESCE、IIF

    NULLIF函数 NULLIF(Expression1,Expression2):给定两个参数Expression1和Expression2,如果两个参数相等,则返回NULL:否则就返回第一个参数. ...

  9. hdu1878-并查集,欧拉回路

    纯裸题..写着方便理解... 题意:判断一个无向图是否存在欧拉回路... 解题思路:并查集判断一下是否联通,然后再判断一下点的度数是否为偶数就行了: #include<iostream> ...

  10. Linux vmstat命令

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...