题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667

思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式。具体的拆边方法为:第i次取这条路时费用为(2*i-1)*a (i<=5),每条边的容量为1。如果这条边通过的流量为x,那正好sigma(2*i-1)(1<<i<<x)==x^2。然后就是跑最小费用最大流了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. #define MAXN 222
  8. #define MAXM 22222222
  9. #define inf 1<<30
  10.  
  11. struct Edge{
  12. int v,cap,cost,next;
  13. }edge[MAXM];
  14.  
  15. int n,m,k,NE;
  16. int head[MAXN];
  17.  
  18. void Insert(int u,int v,int cap,int cost)
  19. {
  20. edge[NE].v=v;
  21. edge[NE].cap=cap;
  22. edge[NE].cost=cost;
  23. edge[NE].next=head[u];
  24. head[u]=NE++;
  25.  
  26. edge[NE].v=u;
  27. edge[NE].cap=;
  28. edge[NE].cost=-cost;
  29. edge[NE].next=head[v];
  30. head[v]=NE++;
  31. }
  32.  
  33. int dist[MAXN];
  34. bool mark[MAXN];
  35. int cur[MAXN],pre[MAXN];
  36. bool spfa(int vs,int vt)
  37. {
  38. memset(mark,false,sizeof(mark));
  39. fill(dist,dist+n+,inf);
  40. dist[vs]=;
  41. queue<int>que;
  42. que.push(vs);
  43. while(!que.empty()){
  44. int u=que.front();
  45. que.pop();
  46. mark[u]=false;
  47. for(int i=head[u];i!=-;i=edge[i].next){
  48. int v=edge[i].v,cost=edge[i].cost;
  49. if(edge[i].cap>&&dist[u]+cost<dist[v]){
  50. dist[v]=dist[u]+cost;
  51. pre[v]=u;
  52. cur[v]=i;
  53. if(!mark[v]){
  54. mark[v]=true;
  55. que.push(v);
  56. }
  57. }
  58. }
  59. }
  60. return dist[vt]<inf;
  61. }
  62.  
  63. int MinCostFlow(int vs,int vt)
  64. {
  65. int cost=,flow=;
  66. while(spfa(vs,vt)){
  67. int aug=inf;
  68. for(int u=vt;u!=vs;u=pre[u]){
  69. aug=min(aug,edge[cur[u]].cap);
  70. }
  71. flow+=aug;cost+=dist[vt]*aug;
  72. for(int u=vt;u!=vs;u=pre[u]){
  73. edge[cur[u]].cap-=aug;
  74. edge[cur[u]^].cap+=aug;
  75. }
  76. }
  77. if(flow<k)cost=-;
  78. return cost;
  79. }
  80.  
  81. int main()
  82. {
  83. int u,v,cost,cap;
  84. while(~scanf("%d%d%d",&n,&m,&k)){
  85. NE=;
  86. memset(head,-,sizeof(head));
  87. while(m--){
  88. scanf("%d%d%d%d",&u,&v,&cost,&cap);
  89. for(int i=;i<=cap;i++){
  90. Insert(u,v,,(*i-)*cost);
  91. }
  92. }
  93. Insert(,,k,);
  94. printf("%d\n",MinCostFlow(,n));
  95. }
  96. return ;
  97. }

hdu 3667(拆边+最小费用最大流)的更多相关文章

  1. hdu 2686 Matrix 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...

  2. hdu 4494 Teamwork 最小费用最大流

    Teamwork Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4494 ...

  3. HDU 4862 JUMP 最小费用最大流

    2014 多校的B题,由于我不怎么搞图论,当时碰到这个题目,我怎么想都没往网络流方面弄,不过网络流真的是个好东西,对于状态多变,无法用动规或者数据结构来很好表示的时候,非常有用 这个题目要求每个点一定 ...

  4. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)

    题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...

  5. hdu3667 Transportation 费用与流量平方成正比的最小流 拆边法+最小费用最大流

    /** 题目:hdu3667 Transportation 拆边法+最小费用最大流 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 题意:n个城市由 ...

  6. hdu 1533 Going Home 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 On a grid map there are n little men and n house ...

  7. HDU 5988.Coding Contest 最小费用最大流

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  8. hdu 2686&&hdu 3376(拆点+构图+最小费用最大流)

    Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

随机推荐

  1. mysql-5.7.12-winx64安装版配置、使用

    一.下载 http://dev.mysql.com/downloads/mysql/ 下载版本:Windows (x86,64-bit), ZIP Archive(mysql-5.7.12-winx6 ...

  2. linux内核——TSS

    task state segment,任务状态段. 关于每个cpu对应不同TSS段的问题,如下解释: TSS段主要用在当前的任务从用户态切入内核态时去找到该任务的内核堆栈. 多核上的任务是真正的并发, ...

  3. 数据库-IO系统性能之衡量性能的几个指标

    转自http://storage.it168.com/a2011/0323/1169/000001169755_all.shtml 作为一个数据库管理员,关注系统的性能是日常最重要的工作之一,而在所关 ...

  4. NAT Network Address Translation,网络地址转换

    Network Address Translation,网络地址转换

  5. powerdesigner 画PDM

    一.PDM概述 PDM(物理数据模型-Physical Data Modal),通俗地理解,就是在PowerDesigner中以图形化的方式展示和设计数据库. PDM中涉及到的基本概念包括: 表: 列 ...

  6. 【服务器防护】centos iptables 防火墙设置 mac过滤

    1.阻止MAC地址为XX:XX:XX:XX:XX:XX主机的所有通信: iptables -A INPUT -s 192.168.1.21 -m mac --mac-source XX:XX:XX:X ...

  7. mysql_use_result & mysql_store_result & MYSQLI_ASYNC

    博文一 : 在使用 mysql_query() 进行一次查询后,一般要用这两个函数之一来把结果存到一个 MYSQL_RES * 变量中. 两者的主要区别是,mysql_use_result() 的结果 ...

  8. C++ 基类指针和子类指针相互赋值

    首先,给出基类animal和子类fish [cpp] view plaincopy //======================================================== ...

  9. spark 学习(二) RDD及共享变量

    声明:本文基于spark的programming guide,并融合自己的相关理解整理而成      Spark应用程序总是包括着一个driver program(驱动程序),它运行着用户的main方 ...

  10. shell脚本 批量转换目录下文件编码

    发布:JB01   来源:脚本学堂     [大 中 小] 分享一例shell脚本,实现可以批量转换目录下的文件编码,很实用的一个小shell,有需要的朋友参考下.原文地址:http://www.jb ...