每个工厂拆成N个工厂,费用分别为1~N倍原费用。

  1. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<iostream>
  7. #include<sstream>
  8. #include<cmath>
  9. #include<climits>
  10. #include<string>
  11. #include<map>
  12. #include<queue>
  13. #include<vector>
  14. #include<stack>
  15. #include<set>
  16. using namespace std;
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19. typedef pair<int,int> pii;
  20. #define pb(a) push(a)
  21. #define INF 0x1f1f1f1f
  22. #define lson idx<<1,l,mid
  23. #define rson idx<<1|1,mid+1,r
  24. #define PI 3.1415926535898
  25. template<class T> T min(const T& a,const T& b,const T& c) {
  26. return min(min(a,b),min(a,c));
  27. }
  28. template<class T> T max(const T& a,const T& b,const T& c) {
  29. return max(max(a,b),max(a,c));
  30. }
  31. void debug() {
  32. #ifdef ONLINE_JUDGE
  33. #else
  34. freopen("in.txt","r",stdin);
  35. // freopen("d:\\out1.txt","w",stdout);
  36. #endif
  37. }
  38. int getch() {
  39. int ch;
  40. while((ch=getchar())!=EOF) {
  41. if(ch!=' '&&ch!='\n')return ch;
  42. }
  43. return EOF;
  44. }
  45.  
  46. const int maxn = ;
  47. int N, M;
  48. int cost[maxn][maxn];
  49.  
  50. void Input()
  51. {
  52. scanf("%d%d", &N, &M);
  53. for(int i = ; i <= N; i++)
  54. for(int j = ; j <= M; j++)
  55. scanf("%d", &cost[i][j]);
  56. }
  57.  
  58. struct Edge
  59. {
  60. int from, to, cost, cap;
  61. };
  62. const int maxv = maxn * maxn + maxn;
  63. vector<int> g[maxv];
  64. vector<Edge> edge;
  65. int n,s,t;
  66.  
  67. void add(int from, int to, int cost, int cap)
  68. {
  69. edge.push_back((Edge){from, to, cost, cap});
  70. g[from].push_back(edge.size() - );
  71. edge.push_back((Edge){to, from, -cost, });
  72. g[to].push_back(edge.size() - );
  73. }
  74.  
  75. void init()
  76. {
  77. for(int i = ; i <= n; i++)
  78. g[i].clear();
  79. edge.clear();
  80. }
  81.  
  82. void construct()
  83. {
  84. n = N + N * M + ;
  85. s = n - ;
  86. t = n;
  87. init();
  88.  
  89. for(int i = ; i <= N; i++)
  90. add(s, i, , );
  91. for(int k = ; k <= N; k++)
  92. {
  93. for(int j = ; j <= M; j++)
  94. {
  95. int id = N + (k - ) * M + j;
  96. add(id, t, , );
  97. for(int i = ; i <= N; i++)
  98. add(i, id, k * cost[i][j], );
  99. }
  100. }
  101. }
  102.  
  103. int d[maxv];
  104. int inq[maxv];
  105. int road[maxv];
  106. int SPFA()
  107. {
  108. memset(d, INF, sizeof(d));
  109. memset(inq, , sizeof(inq));
  110. queue<int> q;
  111. q.push(s);
  112. d[s] = ;
  113. road[s] = -;
  114.  
  115. while(!q.empty())
  116. {
  117. int u = q.front(); q.pop();
  118. inq[u] = false;
  119.  
  120. for(int i = ; i < g[u].size(); i++)
  121. {
  122. Edge &e = edge[g[u][i]];
  123. if(e.cap > && d[u] + e.cost < d[e.to])
  124. {
  125. d[e.to] = d[u] + e.cost;
  126. road[e.to] = g[u][i];
  127. if(!inq[e.to])
  128. {
  129. inq[e.to] = true;
  130. q.push(e.to);
  131. }
  132. }
  133. }
  134. }
  135. return d[t] != INF;
  136. }
  137. int MCMF()
  138. {
  139. int cost = ;
  140. while(SPFA())
  141. {
  142. cost += d[t];
  143. for(int e = road[t]; e != -; e = road[edge[e].from])
  144. {
  145. edge[e].cap -= ;
  146. edge[e^].cap += ;
  147. }
  148. }
  149. return cost;
  150. }
  151. int main()
  152. {
  153. debug();
  154. int t;
  155. scanf("%d", &t);
  156. for(int ca = ; ca <= t; ca++)
  157. {
  158. Input();
  159. construct();
  160. printf("%.6f\n", MCMF() * 1.0 / N);
  161. }
  162. return ;
  163. }

POJ 3686 The Windy's 最小费用最大流的更多相关文章

  1. POJ 2195 Going Home(最小费用最大流)

    http://poj.org/problem?id=2195 题意 :  N*M的点阵中,有N个人,N个房子.让x个人走到这x个房子中,只能上下左右走,每个人每走一步就花1美元,问当所有的人都归位了之 ...

  2. POJ 2135 Farm Tour (最小费用最大流模板)

    题目大意: 给你一个n个农场,有m条道路,起点是1号农场,终点是n号农场,现在要求从1走到n,再从n走到1,要求不走重复路径,求最短路径长度. 算法讨论: 最小费用最大流.我们可以这样建模:既然要求不 ...

  3. POJ 2516 Minimum Cost (最小费用最大流)

    POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...

  4. POJ 2195 Going Home 【最小费用最大流】

    题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:2715 ...

  5. POJ 2135 Farm Tour(最小费用最大流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  6. POJ - 2516 Minimum Cost(最小费用最大流)

    1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...

  7. POJ 2135 Farm Tour(最小费用最大流,变形)

    题意:给一个无向图,FJ要从1号点出发到达n号点,再返回到1号点,但是路一旦走过了就会销毁(即回去不能经过),每条路长度不同,那么完成这趟旅行要走多长的路?(注:会有重边,点号无序,无向图!) 思路: ...

  8. POJ 3686 The Windy's (费用流)

    [题目链接] http://poj.org/problem?id=3686 [题目大意] 每个工厂对于每种玩具的加工时间都是不同的, 并且在加工完一种玩具之后才能加工另一种,现在求加工完每种玩具的平均 ...

  9. POJ 3680:Intervals(最小费用最大流)***

    http://poj.org/problem?id=3680 题意:给出n个区间[Li,Ri],每个区间有一个权值wi,要使得每个点都不被超过k个区间覆盖(最多能被k个区间覆盖),如果选取了第i个区间 ...

随机推荐

  1. 单节点nginx为两台apache服务器提供负载均衡

    需求:本实验为单节点nginx为两台apache服务器提供负载均衡,所有配置为最简单 1.初始化3台测试server,该关的关了 [root@host101 ~]# vim /etc/hosts 19 ...

  2. MySQL日志恢复误删记录

    1.查询日志是否开启 show variables like"log_"; 2.查询是用的哪个日志文件 show master status; 3.定位是在什么时间误删的 /usr ...

  3. Java 程序优化:字符串操作、基本运算方法等优化策略(二)

    五.数据定义.运算逻辑优化 多使用局部变量 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈 (Stack) 里面,读写速度较快. 其他变量,如静态变量.等,都在堆实例变量 (heap) 中创 ...

  4. Linux scp复制文件,不需要输入密码的技巧

    当两台LINUX主机之间要互传文件时可使用SCP命令来实现,建立信任关系之后可不输入密码. 把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中 假 ...

  5. python的中文编码问题

    下文转自 http://blog.csdn.net/mayflowers/article/details/1568852 1.        在Python中使用中文 在Python中有两种默认的字符 ...

  6. JavaScript笔记杂谈篇(啥都有)

    二维码缩放比例以43PX的倍数缩放最为标准. NuGet相关管理http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html 学习笔记: http ...

  7. perl脚本基础总结

    1.  单引号字符串中的\n不会被当做换行符处理. 如:'\'\\'  -->  '\  . 2.  双引号 字符串联    "Hello"."World" ...

  8. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  9. 如何防止ElasticSearch集群出现脑裂现象(转)

    原文:http://xingxiudong.com/2015/01/05/resolve-elasticsearch-split-brain/ 什么是“脑裂”现象? 由于某些节点的失效,部分节点的网络 ...

  10. Address already in use的解决方法

    当客户端保持着与服务器端的连接,这时服务器端断开,再开启服务器时会出现: Address already in usr. 可以用netstat -anp | more 可以看到客户端还保持着与服务器的 ...