POJ 2315 最小费用最大流
从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 最小费用最大流的更多相关文章
- poj 3422(最小费用最大流)
		
题目链接:http://poj.org/problem?id=3422 思路:求从起点到终点走k次获得的最大值,最小费用最大流的应用:将点权转化为边权,需要拆点,边容量为1,费用为该点的点权,表示该点 ...
 - POJ 2516 最小费用最大流
		
每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ...
 - POJ - 2195   最小费用最大流
		
题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ...
 - poj 2195   最小费用最大流模板
		
/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...
 - POJ 2135 最小费用最大流 入门题
		
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19207 Accepted: 7441 Descri ...
 - poj   2135最小费用最大流
		
最小费用最大流问题是经济学和管理学中的一类典型问题.在一个网络中每段路径都有"容量"和"费用"两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择 ...
 - poj 3680(最小费用最大流)
		
题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用 ...
 - POJ 2135 最小费用最大流
		
题目链接 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18961 Accepted: 7326 D ...
 - POJ 2195:Going Home(最小费用最大流)
		
http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...
 
随机推荐
- 关于JSON的总结
			
本文总结自百度百科 JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集. 数据在键值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数 ...
 - Macbook之用brew安装Python
			
1. brew install python 2.If you don't have ~/.bash_profile, add ~/.bash_profile by touch ~/.bash_pro ...
 - 设置ORACLE数据库游标大小
			
先用超级管理员(sys)登陆服务器: sqlplus "sys/***@orcl as sysdba" 连接到:Oracle 查看ORACLE最大游标数: SQL> show ...
 - Part 12 Angularjs filter by multiple properties
			
In the example below, we are using multiple search textboxes. As you type in the "Search name&q ...
 - Linux中Bash发现重大安全漏洞修改方法
			
北京时间9月25日消息,Linux用户今天又得到了一个“惊喜”!Red Hat安全团队在 Linux 中广泛使用的Bash shell中发现了一个隐晦而危险的安全漏洞.该漏洞被称为“Bash Bug” ...
 - C# 谈Dictionary<TKey,TValue>,SortedDictionary<TKey,TValue>排序
			
使用过Dictionary的人都知道,当每一个Add里面的值都不会改变其顺序,所以需要需要对其排序的时候就用到SortedDictionary, 但SortedDictionary并不是那么理想,其默 ...
 - VxWorks 6.9 内核编程指导之读书笔记 -- 多任务
			
概述 VxWork系统任务 任务调度 任务创建和管理 任务的错误状态 任务异常处理 共享代码和重入 概述 现代实时操作系统是基于多任务和任务间通信的概念的.多任务环境运行一个实时进程RTP可以被作为一 ...
 - mysql之触发器trigger(1)
			
触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...
 - 链接与ELF文件格式的复习
			
在这里复习一下链接的知识: 什么是链接(linking):把源代码形成的模块独立编译后组装成一个整体的的过程叫做链接. 链接主要过程包括:地址和空间分配(address and storage all ...
 - JS一些语法
			
1.解构(ES6的语法) 我个人理解就是有一个对象,对象里有几个属性,然后在定义新的变量的时候可以直接指定为和对象里属性名一样的名字,然后就可以关联到新的变量上来.下面看一个小测试例子: //解构 l ...