http://poj.org/problem?id=3686

题意:给出n个玩具和m个工厂,每个工厂加工每个玩具有一个时间,问要加工完这n个玩具最少需要等待的平均时间。例如加工1号玩具时间为t1,加工2号玩具时间为t2。那么先加工玩具1再加工玩具2花费的时间是t1+(t1+t2),先加工玩具2在加工玩具1花费的时间是t2+(t1+t2)。

思路:假设所有玩具在一个工厂加工,那么等待的时间是

t1 + (t1 + t2) + (t1 + t2 + t3) + ……

= t1 * n + t2 * (n-1) + t3 * (n-2) + ……

那么可以把每个工厂能够加工n个玩具转化成有n个工厂每个只能够加工一个玩具,即每个工厂被划分成权值w为1,2,3,……,n的工厂,然后每个工厂制造某个玩具花费的时间为权值*本来需要的时间。

建图即:

源点向每个玩具连流量为1,费用为0的边,

每个玩具向每个工厂连流量为1,费用为w(w为工厂的权值)*cost的边,

每个工厂向源点连流量为1,费用为0的边。

然后跑一遍最小费用最大流,最后把答案除以玩具数就是最终答案。

这个建图思维很厉害。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5. using namespace std;
  6. #define N 2666
  7. #define INF 0x3f3f3f3f
  8. struct Edge {
  9. int u, v, nxt, cap, cost;
  10. Edge () {}
  11. Edge (int u, int v, int nxt, int cap, int cost) : u(u), v(v), nxt(nxt), cap(cap), cost(cost) {}
  12. } edge[N*N];
  13. int n, m, mp[][], head[N], tot, pre[N], dis[N], vis[N], S, T;
  14.  
  15. void Add(int u, int v, int cap, int cost) {
  16. edge[tot] = Edge(u, v, head[u], cap, cost); head[u] = tot++;
  17. edge[tot] = Edge(v, u, head[v], , -cost); head[v] = tot++;
  18. }
  19.  
  20. bool SPFA(int S, int T) {
  21. queue<int> que; que.push(S);
  22. memset(dis, INF, sizeof(dis));
  23. memset(vis, , sizeof(vis));
  24. dis[S] = , vis[S] = ;
  25. while(!que.empty()) {
  26. int u = que.front(); que.pop();
  27. vis[u] = ; // 忘了这句.WA了N久
  28. for(int i = head[u]; ~i; i = edge[i].nxt) {
  29. int v = edge[i].v, cap = edge[i].cap, cost = edge[i].cost;
  30. if(dis[v] > dis[u] + cost && cap > ) {
  31. dis[v] = dis[u] + cost; pre[v] = i;
  32. if(!vis[v]) vis[v] = , que.push(v);
  33. }
  34. }
  35. }
  36. return dis[T] < INF;
  37. }
  38.  
  39. double MFMC(int S, int T) {
  40. int u, flow;
  41. double ans = ;
  42. while(SPFA(S, T)) {
  43. u = T, flow = INF;
  44. while(u != S) {
  45. if(flow > edge[pre[u]].cap) flow = edge[pre[u]].cap;
  46. u = edge[pre[u]].u;
  47. } u = T;
  48. while(u != S) {
  49. edge[pre[u]].cap -= flow, edge[pre[u]^].cap += flow;
  50. ans += edge[pre[u]].cost * flow;
  51. u = edge[pre[u]].u;
  52. }
  53. }
  54. return ans;
  55. }
  56.  
  57. int main() {
  58. int t; scanf("%d", &t);
  59. while(t--) {
  60. scanf("%d%d", &n, &m);
  61. for(int i = ; i <= n; i++)
  62. for(int j = ; j <= m; j++)
  63. scanf("%d", &mp[i][j]);
  64. S = , T = n * m + n + ;
  65. memset(head, -, sizeof(head)); tot = ;
  66. for(int i = ; i <= n; i++) {
  67. Add(S, i, , );
  68. for(int j = ; j <= m; j++) {
  69. Add(j * n + i, T, , );
  70. for(int k = ; k <= n; k++) {
  71. Add(i, j * n + k, , k * mp[i][j]);
  72. }
  73. }
  74. }
  75. printf("%.6f\n", MFMC(S, T) / n);
  76. }
  77. return ;
  78. }

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

  1. POJ 3686 The Windy's 最小费用最大流

    每个工厂拆成N个工厂,费用分别为1~N倍原费用. //#pragma comment(linker, "/STACK:1024000000,1024000000") #includ ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 1.QT该容器QVector,QList,QSet,QMap,QQueue,QStack,QMultiMap,QSingleList等待

    1  新建一个项目 在pro文件里仅仅须要加上CONFIG += C++11 main.cpp #include <QMap> int main() { QMap<int,QStri ...

  2. Entity framework 配置文件,实现类,测试类

    配置文件信息App.config: 数据库IP地址为192.168.2.186 ,数据库名为 Eleven-Six , 用户名 123456,密码654321 <?xml version=&qu ...

  3. 【剑指Offer学习】【面试题4 : 替换空格】

    题目: 请实现一个函数,把字符串中的每个空格替换成"%20",例如“We are happy.”,则输出“We%20are%20happy.”. 以下代码都是通过PHP代码实现. ...

  4. WPF 4 TextBox 笔刷特效

    原文:WPF 4 TextBox 笔刷特效      TextBox 控件是我们开发过程中必不可少的组件,它可以使应用程序方便的与用户进行文字交互.在新WPF 4 中又为TextBox 添加了两种新笔 ...

  5. windows server疑难杂症

    1.某些网址.服务访问失败,可能的原因:增强的安全配置关闭增强的安全配置,并且重启电脑!!!http://jingyan.baidu.com/article/6181c3e076ac0b152ff15 ...

  6. Entity相互关系

    查看 1.图表(.edmx) Model First可以2.代码 内部包含对方(回溯) 1:1   1   2 1:N   3   4 N:M   5   6

  7. MVC基架生成的Edit视图

    @model MyMusicStore.Models.Album @{     ViewBag.Title = "Edit"; } <h2>Edit</h2> ...

  8. IDEA 自动化配置

    # IDEA maven web项目:http://www.cnblogs.com/Sinte-Beuve/p/5730553.html # IDEA 数据库自动化 ## 功能 ① SQL 代码自动感 ...

  9. 配置 Visual Studio Tools for Apache Cordova

    原文:配置 Visual Studio Tools for Apache Cordova 1.连接地址 https://msdn.microsoft.com/zh-cn/library/vs/alm/ ...

  10. Android零基础入门第21节:ToggleButton和Switch使用大全

    原文:Android零基础入门第21节:ToggleButton和Switch使用大全 上期学习了CheckBox和RadioButton,那么本期来学习Button的另外两个子控件ToggleBut ...