UVA - 1658 Admiral (最小费用最大流)
最短路对应费用,路径数量对应流量。为限制点经过次数,拆点为边。跑一次流量为2的最小费用最大流。
最小费用最大流和最大流EK算法是十分相似的,只是把找增广路的部分换成了求费用的最短路。
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxv = +;
- const int maxe = +;
- struct Edge
- {
- int v,cap,cost,nxt;
- void IN(int V,int C,int c,int N)
- {
- v = V; cap = C; cost = c; nxt = N;
- }
- }edges[maxe];
- int head[maxv],ecnt,vcnt;
- void AddEdge(int u,int v,int C,int c)
- {
- edges[ecnt].IN(v,C,c,head[u]);
- head[u] = ecnt++;
- edges[ecnt].IN(u,,-c,head[v]);
- head[v] = ecnt++;
- }
- const int INF = 0x3f3f3f3f;
- int S,T;
- bool vis[maxv];
- int d[maxv],p[maxv],a[maxv];
- bool spfa()
- {
- memset(d,0x3f,sizeof(int)*vcnt);
- memset(vis,,sizeof(bool)*vcnt);
- queue<int> q; q.push(S); d[S] = ;
- a[S] = INF;
- while(q.size()){
- int u = q.front(); q.pop();
- vis[u] = false;
- for(int i = head[u]; ~i; i = edges[i].nxt){
- Edge &e = edges[i];
- if(e.cap&& d[e.v] > d[u]+e.cost){
- d[e.v] = d[u] + e.cost;
- p[e.v] = i;
- a[e.v] = min(a[u],e.cap);
- if(!vis[e.v]) { q.push(e.v); vis[e.v] = true; }
- }
- }
- }
- return d[T] != INF;
- }
- ll MinCostMaxFlow()
- {
- ll cost = ;
- while(spfa()){
- cost += d[T];
- for(int i = T; i != S; i = edges[p[i]^].v){
- edges[p[i]].cap -= a[T];
- edges[p[i]^].cap += a[T];
- }
- }
- return cost;
- }
- int pin[maxv],pout[maxv];
- int main()
- {
- //freopen("in.txt","r",stdin);
- int v,e;
- int S = ; T = ;
- while(~scanf("%d%d",&v,&e)){
- vcnt = ; ecnt = ;
- pin[] = pout[] = vcnt++;
- pin[v] = pout[v] = vcnt++;
- for(int i = ; i < v; i++) {
- pin[i] = vcnt++;
- pout[i] = vcnt++;
- }
- memset(head,-,sizeof(int)*(vcnt));
- AddEdge(S,pin[],,);
- AddEdge(pout[v],T,,);
- for(int i = ; i < v; i++) AddEdge(pin[i],pout[i],,);
- while(e--){
- int u,v,c; scanf("%d%d%d",&u,&v,&c);
- AddEdge(pout[u],pin[v],,c);
- }
- printf("%lld\n",MinCostMaxFlow());
- }
- return ;
- }
UVA - 1658 Admiral (最小费用最大流)的更多相关文章
- UVa 1658 Admiral(最小费用最大流)
拆点费用流 --------------------------------------------------------------------- #include<cstdio> # ...
- 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 10806 Dijkstra,Dijkstra(最小费用最大流)
裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...
- UVA 10806 最小费用最大流
终于可以写这道题的题解了,昨天下午纠结我一下下午,晚上才照着人家的题解敲出来,今天上午又干坐着想了两个小时,才弄明白这个问题. 题意很简单,给出一个无向图,要求从1 到 n最短路两次,但是两次不允许经 ...
- UVA - 1658 Admiral
3. C - Admiral 题意:给定v(3<=v<=1000)个节点,e(3<=e<=10000)条边的又向加权图,求1->v的两条不相交的路径,使得权和最小. 思路 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
随机推荐
- 3-C++程序的结构1.4
共享数据的保护 对于既需要共享.又需要防止改变的数据应该声明为常量. 1.常引用 如果在声明引用时用const修饰,被声明的引用就是常引用.常引用所引用的对象不能被更新.声明形式如下: const 类 ...
- lightoj 1035【暴力】
思路: 预处理一下素数数组,然后暴力计算就好了. 类似处理素数因子: #include <cstdio> #include <iostream> #include <st ...
- 笔记-JavaWeb学习之旅11
请求转发:一种在服务器内部的资源跳转方式 使用步骤 1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path) ...
- java 阻塞队列(转)
转自 http://ifeve.com/java-blocking-queue/ 1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列 ...
- TTM-To the moon
传送门 查询历史版本,回到历史版本,这个题目显然是用主席树,好像就没了! 但是这里的修改是区间修改,众所周知主席树的空间复杂度是\(nlog(n)\)的,区间修改会导致主席树的开点到达一个相当恐怖的数 ...
- JIRA中的标记语言的语法参考
前言 看到网上有的文章说JIRA是使用Textile这门标记语言,有些语法和Wikitext和Markdown相像.JIRA在2017年进行了一次大更新,某些语法可能和以前不大一样,这里纪录一下常用的 ...
- DRF教程5-API接口文档和接口测试
配置 配置好,就可以访问web页面 pip install coreapi #安装依赖 from rest_framework.documentation import include_docs_ur ...
- 牛客练习赛42B(异或的性质)
传送门 b^ c >= b - c,这个结论应该记住,我还在这里证过…… 这个题就用到了这个结论,假如当前答案集合为S,和为a,异或和为b,当前答案为a+b了.这时又读入个c,该不该加进来?a ...
- struts2的@Result annotation 如何添加params,并且在页面取值
http://www.bubuko.com/infodetail-2492575.html .............................................. 标签:lai ...
- centos7 更换jdk版本
查看java版本 java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...