从1走到N然后从N走回来的最短路程是多少? 转换为费用流来建模.

   1:  /**
   2:  因为e ==0 所以 pe[v]   pe[v]^1 是两条相对应的边
   3:  E[pe[v]].c -= aug;            E[pe[v]^1].c += aug;
   4:  
   5:  */
   6:  #include <queue>
   7:  #include <iostream>
   8:  #include <string.h>
   9:  #include <stdio.h>
  10:  #include <map>
  11:  using namespace std;
  12:  #define V 30010      // vertex
  13:  #define E 150010      // edge
  14:  #define INF 0x3F3F3F3F
  15:  struct MinCostMaxFlow
  16:  {
  17:      struct Edge
  18:      {
  19:          int v, next, cap, cost;  // cap 为容量, cost为单位流量费用
  20:      } edge[E];
  21:   
  22:      int head[V], pe[V], pv[V];            // 每个节点的第一条edge[idx]的编号.
  23:      int  dis[V];            // the shortest path to the src
  24:      bool vis[V];            // visted
  25:      // pe[v]  存放在增广路上到达v的边(u,v) 在edge[]的位置
  26:      // pv[u]  存放在增广路上从u出发的边(u,v) 在edge[]中的位置
  27:      int e, src, sink;            // the index of the edge
  28:      void addedge(int  u, int v, int cap, int cost)
  29:      {
  30:          edge[e].v = v, edge[e].cap = cap;
  31:          edge[e].cost = cost,edge[e].next = head[u], head[u] = e++;
  32:          edge[e].v = u, edge[e].cap = 0;
  33:          edge[e].cost = -1*cost, edge[e].next = head[v], head[v] = e++;
  34:      }
  35:      // 求最短路,不存在负环的时候,比 DFS快
  36:      int SPFABFS()
  37:      {
  38:          memset(vis, 0 ,sizeof(vis));
  39:          memset(pv, -1, sizeof(pv));
  40:          for(int i=0; i<V; i++) dis[i] = INF;
  41:          queue<int> Q;
  42:          Q.push(src), vis[src] = 1, dis[src] = 0;
  43:          while(!Q.empty())
  44:          {
  45:              int u = Q.front();
  46:              Q.pop(), vis[u] = 0;
  47:              for(int i=head[u]; i!=-1; i=edge[i].next)
  48:              {
  49:                  int v = edge[i].v;
  50:                  if(edge[i].cap > 0 &&  dis[v] > dis[u] + edge[i].cost  )
  51:                  {
  52:                      dis[v] = dis[u] + edge[i].cost;
  53:                      if(!vis[v]) Q.push(v),vis[v] = 1;
  54:                      pv[v] = u, pe[v] = i;
  55:                  }
  56:              }
  57:          }
  58:          if(dis[sink] == INF) return -2;          // can't from src to sink.
  59:          return dis[sink];
  60:      }
  61:   
  62:      pair<int,int> MCMF()
  63:      {
  64:          int maxflow = 0, mincost = 0;
  65:          while(SPFABFS())
  66:          {
  67:              if(pv[sink] == -1) break;
  68:              int aug = INF;
  69:              for(int i= sink; i!= src; i = pv[i])
  70:                  aug =min(aug, edge[pe[i]].cap);
  71:              maxflow += aug;
  72:              mincost += aug * dis[sink];
  73:              for(int i = sink; i!= src; i = pv[i])
  74:              {
  75:                  edge[pe[i]].cap -= aug;
  76:                  edge[pe[i]^1].cap += aug;
  77:              }
  78:          }
  79:          return make_pair(maxflow, mincost);
  80:      }
  81:   
  82:      /// 一定需要初始化的是 src, sink
  83:      void solve()
  84:      {
  85:          int N,M;
  86:          while(scanf("%d%d", &N , &M)!= EOF)
  87:          {
  88:              e=0;
  89:              memset(head, -1,sizeof(head));
  90:              for(int i=0; i<M; i++)
  91:              {
  92:                  int a, b, c;
  93:                  scanf("%d%d%d", &a, &b, &c);
  94:                  addedge(a, b,1,c);
  95:                  addedge(b, a,1, c);
  96:              }
  97:              src = 0;
  98:              sink = N+1;
  99:              addedge(src,1, 2, 0);
 100:              addedge(N, sink, 2, 0);
 101:              pair<int,int> ret = MCMF();
 102:              cout<<ret.second<<endl;
 103:          }
 104:      }
 105:  } mcmf;
 106:   
 107:  int main()
 108:  {
 109:      mcmf.solve();
 110:      return 0;
 111:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

POJ 2315 最小费用最大流的更多相关文章

  1. poj 3422(最小费用最大流)

    题目链接:http://poj.org/problem?id=3422 思路:求从起点到终点走k次获得的最大值,最小费用最大流的应用:将点权转化为边权,需要拆点,边容量为1,费用为该点的点权,表示该点 ...

  2. POJ 2516 最小费用最大流

    每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ...

  3. POJ - 2195 最小费用最大流

    题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ...

  4. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

  5. POJ 2135 最小费用最大流 入门题

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19207   Accepted: 7441 Descri ...

  6. poj 2135最小费用最大流

    最小费用最大流问题是经济学和管理学中的一类典型问题.在一个网络中每段路径都有"容量"和"费用"两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择 ...

  7. poj 3680(最小费用最大流)

    题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用 ...

  8. POJ 2135 最小费用最大流

    题目链接 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18961   Accepted: 7326 D ...

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

    http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...

随机推荐

  1. poj 1698 Alice's Chance 最大流

    题目:给出n部电影的可以在周几拍摄.总天数.期限,问能不能把n部电影接下来. 分析: 对于每部电影连上源点,流量为总天数. 对于每一天建立一个点,连上汇点,流量为为1. 对于每部电影,如果可以在该天拍 ...

  2. 获取input中的值

    先在input标签中添加一个id='getvalue'document.getElementById("getvalue").value;

  3. EF Code First 数据迁移命令

    只需要开启程序管理控制台(Package Manager Console) 然后输入  Enable-Migrations -ContextTypeName youContextdb(你的数据库上下文 ...

  4. PHP计算中英混输字符串长度

    最近做项目中碰到需要post value length check的这么一个情况 有这么一个需求, 需要backend来处理post过来的中英混输的数据. 对其限制的规则是中文10个字符, 英文20个 ...

  5. springmvc的一个小例子学习(一)

    个人觉得,学框架最好的 方法无外乎两个:一个是实践这个框架,真实的去用它,比如spring框架,先搭一个简单的spring项目,然后一步一步得去丰富它,从中学到spring框架的精髓和知识:另外一个就 ...

  6. NPOI--操作Excel之利器(一)

    最近在做一个产品配置的项目,类似于京东上的自主装机,也就是根据自己的需要配置一套完整的产品,只不过我们做的是一个网络产品的配置,如路由器,交换机等网络设备.配置完成后会将配置的信息导出到Excel中, ...

  7. 配置JDK和TOMCAT

    配置JDK 1.先从官网下载最新的JDK安装包,然后安装.安装过程中会询问是否再装JRE,因为JDK中已经包含JRE,所以不必重复安装. 2.注意安装的路径名最好不要有中文或者空格出现. 3.在系统环 ...

  8. ASP.NET MVC自定义路由 - 实现IRouteConstraint限制控制器名(转载)

    自定义约束前 namespace MvcApplication2 { public class RouteConfig { public static void RegisterRoutes(Rout ...

  9. init: Associated with Deployer 'Catalina:type=Deployer,host=localhost'

     四月 12, 2014 1:54:12 上午 org.apache.catalina.core.ApplicationContext log信息: HTMLManager: init: Associ ...

  10. Requirejs学习笔记(一)

    中文api 和 英文api网上都有的我就不翻译了,我的学习方法是先看英文api,然后看不懂的就比对中文api看一遍. requirejs可以帮助js代码模块化开发,模块化意味了解决了代码凌乱的问题,方 ...