uva 1658(最小费用最大流)
题意:一个带权有向图,求起点到终点的两条路径权值之和最小,且两条路径没有公共点(除起点,终点);
分析:拆点法,将u拆成u和u',u-u'容量为1,费用为0,这样就能保证每个点只用一次,起点s-s'容量为2,终点t-t'容量为2保证最大流会求出两条路径,若输入u-v,权为c,则增加边u'-v,容量为1,费用为c.
- #include <cstdio>
- #include <iostream>
- #include <sstream>
- #include <cmath>
- #include <cstring>
- #include <cstdlib>
- #include <string>
- #include <vector>
- #include <map>
- #include <set>
- #include <queue>
- #include <stack>
- #include <algorithm>
- using namespace std;
- #define ll long long
- #define _cle(m, a) memset(m, a, sizeof(m))
- #define repu(i, a, b) for(int i = a; i < b; i++)
- #define repd(i, a, b) for(int i = b; i >= a; i--)
- #define sfi(n) scanf("%d", &n)
- #define pfi(n) printf("%d\n", n)
- #define sfi2(n, m) scanf("%d%d", &n, &m)
- #define pfi2(n, m) printf("%d %d\n", n, m)
- #define pfi3(a, b, c) printf("%d %d %d\n", a, b, c)
- #define maxn 2010
- #define maxm 10*maxn
- const int inf = 0x3f3f3f3f;
- struct Nod {
- int b, nxt;
- int cap, cst;
- void init(int b, int nxt, int cap, int cst) {
- this->b = b;
- this->nxt = nxt;
- this->cap = cap;
- this->cst = cst;
- }
- };
- struct MinCost {
- int E[maxn]; int n;
- Nod buf[maxm*]; int len;
- int p[maxn];
- void init(int n) {
- this->n = n;
- memset(E, , sizeof(E));
- len = ;
- }
- void addCap(int a, int b, int cap, int cst) {
- buf[len].init(b, E[a], cap, cst); E[a] = len ++;
- buf[len].init(a, E[b], , -cst); E[b] = len ++;
- }
- bool spfa(int source, int sink) {
- static queue<int> q;
- static int d[maxn];
- memset(d, , sizeof(d));
- memset(p, , sizeof(p));
- d[source] = ;
- q.push(source);
- int u, v;
- while(!q.empty()) {
- u = q.front();
- q.pop();
- for(int i = E[u]; i != -; i = buf[i].nxt) {
- v = buf[i].b;
- if(buf[i].cap> && d[u]+buf[i].cst<d[v]) {
- d[v] = d[u]+buf[i].cst;
- p[v] = i;
- q.push(v);
- }
- }
- }
- return d[sink] != inf;
- }
- int solve(int source, int sink) {
- int minCost = ,maxFlow = ;//需要maxFlow的话,想办法返回
- while(spfa(source, sink)) {
- int neck = inf;
- for(int t=p[sink]; t != -; t = p[ buf[t^].b ])//buf[t^1].b是父节点
- neck = min(neck, buf[t].cap);
- maxFlow += neck;
- for(int t = p[sink]; t != -; t = p[ buf[t^].b ]) {
- buf[t].cap -= neck;
- buf[t^].cap += neck;
- minCost += buf[t].cst * neck;
- }
- }
- return minCost;
- }
- } mc;
- int main()
- {
- int n, m;
- while(~sfi2(n, m))
- {
- mc.init(n);
- int a, b, c;
- repu(i, , m)
- {
- sfi2(a, b), sfi(c);
- mc.addCap((--a) + n, --b, , c);
- }
- repu(i, , n - ) mc.addCap(i, i + n, , );
- mc.addCap(, n, , );
- mc.addCap(n - , n * - , , );
- pfi(mc.solve(, n - ));
- }
- return ;
- }
uva 1658(最小费用最大流)的更多相关文章
- UVA 10806 最小费用最大流
终于可以写这道题的题解了,昨天下午纠结我一下下午,晚上才照着人家的题解敲出来,今天上午又干坐着想了两个小时,才弄明白这个问题. 题意很简单,给出一个无向图,要求从1 到 n最短路两次,但是两次不允许经 ...
- UVa 1658 - Admiral(最小费用最大流 + 拆点)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1658 海军上将(拆点法+最小费用限制流)
海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...
- UVA - 1658 Admiral (最小费用最大流)
最短路对应费用,路径数量对应流量.为限制点经过次数,拆点为边.跑一次流量为2的最小费用最大流. 最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路. #include ...
- UVa 10806 Dijkstra,Dijkstra(最小费用最大流)
裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- bzoj1927最小费用最大流
其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→ =_=你TM逗我 刚要删突然感觉dinic的模 ...
- ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)
将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
随机推荐
- 20145320《Java程序设计》第四次实验报告
20145320<Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.26 15: ...
- 20145320 《Java程序设计》第5周学习总结
20145320 <Java程序设计>第5周学习总结 教材学习内容总结 8.1 语法与继承架构 try.catch Java中的错误会被包装为对象,而使用try与catch,JVM会执行t ...
- LATEX论文排版学习资源汇总
一.国内出版的LaTeX书籍 不管是ctex还是chinatex论坛,很多TeX前辈和使用者都给大家提供了很多咨询帮助,同时,也分享了很多很多学习上的方法与技巧.一般都推荐入门的用户先阅读一本入门书, ...
- 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)
前言 在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(N*logN).因此,在使用比较排序时,时间复杂度的下限就是O(N*logN).而桶排序的时间复杂度是O(N+C),因为它的实现并不是基于 ...
- 一个安邦逻辑漏洞爆破密码的py脚本
漏洞地址: 安邦保险集团存在逻辑漏洞可遍历用户ID暴力破解用户原始密码进而重置用户密码(附脚本) http://www.wooyun.org/bugs/wooyun-2010-0119851 脚本PO ...
- 【笔记】after,before,insertAfter,insertBefore的作用
这几个方法的作用是插入外部节点,所谓外部插入节点就是我们平常在网页编程中手动添加代码到某一句语句的前面或后面,如图: 红色框的P是在蓝色框span的前面插入的外部节点,反过来说蓝色框的span是在红色 ...
- iphone和ipad各控件大小
ipad和iphone是一样的:
- 前端开发面试题JS
1.介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的数据类型 ) 2. ...
- Python—I/O多路复用
一.I/O多路复用概念: 监听多个描述符的状态,如果描述符状态改变,则会被内核修改标志位,从而被进程获取进而进行读写操作 二.select,poll,epoll select模块,提供了:select ...
- 【转】运行java -version命令时出现错误及解决
转载地址:http://blog.sina.com.cn/s/blog_50f21fed01012sf2.html 按照上一篇的步骤配置JAVA_HOME.CLASSPATH和Path三个变量 ...