http://acm.hdu.edu.cn/showproblem.php?pid=3667

最小费用最大流

本题流量和费用不是线性关系,fee=a*flow*flow,所以常规套模板spfa无法得到最小费用

观察到每条边流量上限只有5,则可以把一条流量为f的边拆成f条流量为1的边,每条边费用是a*(2*i-1)(1<=i<=f)

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. using namespace std ;
  6. const int INF=0xfffffff ;
  7. struct node{
  8. int s,t,cap,cost,nxt ;
  9. }e[] ;
  10. int sumflow ;
  11. int n,m,k,cnt,head[],vis[],dis[],pre[] ;
  12. void add(int s,int t,int cap,int cost)
  13. {
  14. e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].cost=cost ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
  15. e[cnt].s=t ;e[cnt].t=s ;e[cnt].cap= ;e[cnt].cost=-cost ;e[cnt].nxt=head[t] ;head[t]=cnt++ ;
  16. }
  17. int spfa(int s,int t,int N)
  18. {
  19. for(int i= ;i<=N ;i++)
  20. dis[i]=INF ;
  21. dis[s]= ;
  22. memset(vis,,sizeof(vis)) ;
  23. memset(pre,-,sizeof(pre)) ;
  24. vis[s]= ;
  25. queue <int> q ;
  26. q.push(s) ;
  27. while(!q.empty())
  28. {
  29. int u=q.front() ;
  30. q.pop() ;
  31. vis[u]= ;
  32. for(int i=head[u] ;i!=- ;i=e[i].nxt)
  33. {
  34. int tt=e[i].t ;
  35. if(e[i].cap && dis[tt]>dis[u]+e[i].cost)
  36. {
  37. dis[tt]=dis[u]+e[i].cost ;
  38. pre[tt]=i ;
  39. if(!vis[tt])
  40. {
  41. vis[tt]= ;
  42. q.push(tt) ;
  43. }
  44. }
  45. }
  46. }
  47. if(dis[t]==INF)return ;
  48. return ;
  49. }
  50. int MCMF(int s,int t,int N)
  51. {
  52. int flow,minflow,mincost ;
  53. mincost=flow= ;
  54. while(spfa(s,t,N))
  55. {
  56. minflow=INF ;
  57. for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
  58. minflow=min(minflow,e[i].cap) ;
  59. flow+=minflow ;
  60. for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
  61. {
  62. e[i].cap-=minflow ;
  63. e[i^].cap+=minflow ;
  64. }
  65. mincost+=dis[t]*minflow ;
  66. }
  67. sumflow=flow ;//最大流
  68. if(sumflow<k)return - ;
  69. return mincost ;
  70. }
  71. int main()
  72. {
  73. while(~scanf("%d%d%d",&n,&m,&k))
  74. {
  75. cnt= ;
  76. memset(head,-,sizeof(head)) ;
  77. while(m--)
  78. {
  79. int u,v,a,c ;
  80. scanf("%d%d%d%d",&u,&v,&a,&c) ;
  81. for(int i= ;i<=c ;i++)
  82. add(u,v,,a*(*i-)) ;//Σa*(2*i-1)=a*c*c
  83. }
  84. add(,,k,) ;
  85. printf("%d\n",MCMF(,n,n+)) ;
  86. }
  87. return ;
  88. }

HDU 3667的更多相关文章

  1. HDU 3667 Transportation(网络流之费用流)

    题目地址:HDU 3667 这题的建图真是巧妙...为了保证流量正好达到k.须要让每一次增广到的流量都是1,这就须要把每一条边的流量都是1才行.可是每条边的流量并非1,该怎么办呢.这个时候能够拆边,反 ...

  2. HDU 3667.Transportation 最小费用流

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. hdu 3667(拆边+最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...

  4. hdu 3667 拆边加最小费用流

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. HDU 3667 费用流(拆边)

    题意:有n个城市(1~n),m条有向边:有k件货物要从1运到n,每条边最多能运c件货物,每条边有一个危险系数ai,经过这条路的费用需要ai*x2(x为货物的数量),问所有货物安全到达的费用. 思路:c ...

  6. hdu 3667(最小费用最大流+拆边)

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. hdu 3667 (拆边 mcmf)

    注意题目中 边的容量 <= 5.可以把费用权值 a *f ^2化归成 a * f2, 即第一条边费用为 1 * a, 第二条 为 (4 - 1) * a, 第三条为 (9  - 4) * a.. ...

  8. hdu 3667 /2010哈尔滨赛区H题 费用与流量为非线性关系/费用流

    题意: 在一般费用流题目改动:路过某路,每x单位流量须要花费 ai*x^2(ai为给定的系数). 開始的的时候,一看仅仅只是是最后统计费用上在改动罢了,一看例子.发现根本没那么简单(ps:以后每次写程 ...

  9. HDU 3667 费用流 拆边 Transportation

    题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...

随机推荐

  1. maven解决“Could not calculate build plan”问题

    错误提示如下:(eclipse+maven) Could not calculate build plan: Failure to transfer org.apache.maven.plugins: ...

  2. POJ1006——Biorhythms(中国剩余定理)

    Biorhythms Description人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色. ...

  3. visual studio多工程开发配置

    文章:带你玩转Visual Studio——带你多工程开发 带你玩转Visual Studio——带你理解微软的预编译头技术 通过上一篇文章带你玩转Visual Studio——带你多工程开发的讲解, ...

  4. 文字和图片居中的HTML代码怎么写?

    HTML 代码 ,怎么将文本/ 图片居中?这是在W3Cschool的编程问答中前端♌蕾儿提出的问题.网友施主同西否给出了详细的解答. html文字居中和html图片居中方法代码,通过在html中实现文 ...

  5. Cooperation.GTST团队项目总结

    Cooperation.GTST团队项目总结 项目实现情况 目前对于基本UI界面的设计已经实现,对博客园接口XML的解析也已经完成,但是还暂时无法动态获取对应数据. 几张静态预览图展示(侧滑栏设计加入 ...

  6. ubuntu16.04安装tensorflow官方教程与机器学习资料【学习笔记】

    tensorflow官网有官方的安装教程:https://www.tensorflow.org/install/install_linux google的机器学习官方快速入门教程:https://de ...

  7. ThinkPHP开发博客系统笔记之一

    1.前后台搭建 开发的第一步是搭建前后台系统.搭建前台系统的时候新建了LoginController控制器和登录界面View/Login/index.tpl.模板文件中需要引入js和css文件,这里想 ...

  8. HDU 6354 Everything Has Changed(余弦定理)多校题解

    题意:源点处有个圆,然后给你m个圆(保证互不相交.内含),如果源点圆和这些原相交了,就剪掉相交的部分,问你最后周长(最外面那部分的长度). 思路:分类讨论,只有内切和相交会变化周长,然后乱搞就行了.题 ...

  9. HDU 1438 钥匙计数之一(状压DP)题解

    思路: 每个槽有4种深度,一共有2^4种状态.然后开4维来保存每一次的状态:dp[ 第几个槽 ][ 当前状态 ][ 末尾深度 ][ 是否符合要求 ]. 代码: #include<cstdio&g ...

  10. AJAX,JSON,GSON

    AJAX将数据使用JSON格式发送给后端Servlet或其他语言解析. 对JSON内容使用GSON外扩展包进行分解,并使用(如查询用户名是否已经被注册), 最后使用Map集合设置新的返回状态码,并使用 ...