UVa 1658 (拆点法 最小费用流) Admiral
题意:
给出一个有向带权图,求从起点到终点的两条不相交路径使得权值和最小。
分析:
第一次听到“拆点法”这个名词。
把除起点和终点以外的点拆成两个点i和i',然后在这两点之间连一条容量为1,费用为0的边。这样就保证了每个点最多经过一次。
其他有向边的容量也是1
然后求从起点到终点的流量为2(这样就保证了是两条路径)的最小费用流。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = + ;
- const int INF = ;
- struct Edge
- {
- int from, to, cap, flow, cost;
- Edge(int u, int v, int c, int f, int w): from(u), to(v), cap(c), flow(f), cost(w) {}
- };
- struct MCMF
- {
- int n, m;
- vector<Edge> edges;
- vector<int> G[maxn];
- int inq[maxn]; //是否在队列中
- int d[maxn]; //Bellman-Ford
- int p[maxn]; //上一条弧
- int a[maxn]; //可改进量
- void Init(int n)
- {
- this->n = n;
- for(int i = ; i < n; ++i) G[i].clear();
- edges.clear();
- }
- void AddEdge(int from, int to, int cap, int cost)
- {
- edges.push_back(Edge(from, to, cap, , cost));
- edges.push_back(Edge(to, from, , , -cost));
- m = edges.size();
- G[from].push_back(m-);
- G[to].push_back(m-);
- }
- bool BellmanFord(int s, int t, int flow_limit, int& flow, int& cost)
- {
- for(int i = ; i < n; ++i) d[i] = INF;
- memset(inq, , sizeof(inq));
- d[s] = ; inq[s] = ; p[s] = ; a[s] = INF;
- queue<int> Q;
- Q.push(s);
- while(!Q.empty())
- {
- int u = Q.front(); Q.pop();
- inq[u] = ;
- for(int i = ; i < G[u].size(); ++i)
- {
- Edge& e = edges[G[u][i]];
- if(e.cap > e.flow && d[e.to] > d[u] + e.cost)
- {
- d[e.to] = d[u] + e.cost;
- p[e.to] = G[u][i];
- a[e.to] = min(a[u], e.cap - e.flow);
- if(!inq[e.to]) { Q.push(e.to); inq[e.to] = ; }
- }
- }
- }
- if(d[t] == INF) return false;
- if(flow + a[t] > flow_limit) a[t] = flow_limit - flow;
- flow += a[t];
- cost += d[t] * a[t];
- for(int u = t; u != s; u = edges[p[u]].from)
- {
- edges[p[u]].flow += a[t];
- edges[p[u]^].flow -= a[t];
- }
- return true;
- }
- int MincostMaxflow(int s, int t, int flow_limit, int& cost)
- {
- int flow = ; cost = ;
- while(flow < flow_limit && BellmanFord(s, t, flow_limit, flow, cost));
- return flow;
- }
- }g;
- int main()
- {
- //freopen("in.txt", "r", stdin);
- int n, m;
- while(scanf("%d%d", &n, &m) == && n)
- {
- g.Init(n*-);
- //2~n-1 i和i'的编号分别为1~n-2 n~2n-3
- for(int i = ; i <= n-; ++i) g.AddEdge(i-, n-+i, , );
- for(int i = ; i < m; ++i)
- { //连接a'->b
- int a, b, c;
- scanf("%d%d%d", &a, &b, &c);
- if(a != && a != n) a += n-; else a--;
- b--;
- g.AddEdge(a, b, , c);
- }
- int cost;
- g.MincostMaxflow(, n-, , cost);
- printf("%d\n", cost);
- }
- return ;
- }
代码君
UVa 1658 (拆点法 最小费用流) Admiral的更多相关文章
- Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负
/** 题目:Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负 链接:https://vjudge.net/problem/UVA-1161 ...
- Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。
/** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...
- UVa1658 Admiral(拆点法+最小费用流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51253 [思路] 固定流量的最小费用流. 拆点,将u拆分成u1和u ...
- UVa 1658 - Admiral(最小费用最大流 + 拆点)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1658 海军上将(拆点法+最小费用限制流)
海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...
- uva 1658 Admiral (最小费最大流)
uva 1658 Admiral 题目大意:在图中找出两条没有交集的线路,要求这两条线路的费用最小. 解题思路:还是拆点建图的问题. 首先每一个点都要拆成两个点.比如a点拆成a->a'.起点和终 ...
- UVA1658 Admiral 拆点法解决结点容量(路径不能有公共点,容量为1的时候) 最小费用最大流
/** 题目:UVA1658 Admiral 链接:https://vjudge.net/problem/UVA-1658 题意:lrj入门经典P375 求从s到t的两条不相交(除了s和t外,没有公共 ...
- 【uva 1658】Admiral(图论--网络流 最小费用最大流)
题意:有个N个点M个边的有向加权图,求1~N的两条不相交路径(除了起点和终点外没有公共点),使得权和最小. 解法:不相交?也就是一个点只能经过一次,也就是我后面博文会讲的"结点容量问题&qu ...
- 紫书 习题 11-4 UVa 1660 (网络流拆点法)
这道题改了两天-- 因为这道题和节点有关, 所以就用拆点法解决节点的容量问题. 节点拆成两个点, 连一条弧容量为1, 表示只能经过一次. 然后图中的弧容量无限. 然后求最小割, 即最大流, 即为答案. ...
随机推荐
- WPF解析TTF 字体
偶遇需要自己解析 TTF 字体并显示,此做... using System; using System.Collections.Generic; using System.Drawing.Text; ...
- CSS3属性box-shadow使用教程,css3box-shadow
CSS3的box-shadow属性可以让我们轻松实现图层阴影效果.我们来实战详解一下这个属性. 1. box-shadow属性的浏览器兼容性先来看一个这个属性的浏览器兼容性: Opera: 不知道是从 ...
- 中国餐馆过程(CRP)
查如何事先确定聚类簇数目发现的,是对狄利克雷过程的(DP)的一种解释. 假设一个中国餐馆有无限的桌子,第一个顾客到来之后坐在第一张桌子上.第二个顾客来到可以选择坐在第一张桌子上,也可以选择坐在一张新的 ...
- PAT-乙级-1055. 集体照 (25)
1055. 集体照 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 拍集体照时队形很重要,这里对给定的N ...
- Linux 终端访问 FTP 及 上传下载 文件
今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...
- VC6.0环境安装STLport-5.2.1
今天安装STLport,网上搜资料安装好久,都不行,因为STLport 的版本不对,我这是STLport-5.2.1新版本. (注意:下面的步骤都在一个cmd里操作,很简单的原因:环境变量啊) 1.首 ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
- SPOJ NSUBSTR Substrings 后缀自动机
人生第一道后缀自动机,总是值得纪念的嘛.. 后缀自动机学了很久很久,先是看CJL的论文,看懂了很多概念,关于right集,关于pre,关于自动机的术语,关于为什么它是线性的结点,线性的连边.许多铺垫的 ...
- 【QT】计时器制作
应小伙伴的要求,做一个小计时器.功能是点击开始就从00:00:00开始计时,点击暂停就暂停计时,点击停止就停止计时. 界面如上图,使用ui设计师直接拖的.按钮和图标的图片都是网上下载的.用美图秀秀抠成 ...
- POJ 1663
#include<iostream>//cheng da cai zi using namespace std; int main() { int time; cin>>tim ...