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 ...
随机推荐
- Cpython 解释器下实现并发编程
背景知识: 顾明思议: 进程即正在执行的一个过程,进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统, 是操作系统最核心的概念,也是操作系统提供的最古老的最重要的抽象概念之一.操作系统的其他所 ...
- qq开放平台可以应用到网页游戏的api整理
创建角色界面api整理 一.需求描述 1. 创建角色名称可以用qq空间昵称代替 2. 如果玩家是在新区玩的话,赠送老玩家支持礼包 3. 可以看到,好友xxx也在玩,而且到了多少等级,如果加为好友 ...
- Java对象池示例
单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...
- [3dmax教程] 人物+骨骼+蒙皮+动画教程
人物+骨骼+蒙皮+动画完整教程选准备好一个人,做人的方法我在这里就不做了,大家可以学都用poser来做一个. 在大腿里建立4根骨骼! 在前视图中移动如图所示位置! 做一段简单的骨骼向前伸的动画,做4 ...
- mysql 5.6 安装x64版本
从mysql下载的 32bit的 msi installer 后 , 安装的时候没有发现选择x64的地方, 最后安装完毕后发现server是32bit的,只能删除server( installer ...
- WPF Set connectionId threw an exception异常 以及重复dll的问题
1.DataOutputWPF 在显示norlib.Basic.UserConfigControl时 抛出异常 xmlparsingException : WPF Set connectionId t ...
- 织梦cms 应急响应 修复建议
通过分析log日志,可以知道攻击者的IP 攻击时间 和具体操作 本片文章为内网测试,通过分析日志,进行复现攻击流程,同时对网站的后门给予修复建议 通过分析日志可以知道,攻击者使用了扫描工具进行网站扫描 ...
- PJzhang:百度网盘是如何泄露公司机密的?
猫宁!!! 参考链接:https://mp.weixin.qq.com/s/PLELMu8cVleOLlwRAAYPVg 百度网盘在中国一家独大,百度超级会员具有很多特权,尤其是在下载速度上,是普通会 ...
- Java 工程师面试题和笔试题整理(一)
根据自己之前收集的还有一部分自己面试的整理出来,希望能帮到面试的兄弟(2017). 海科融通 笔试题 1.有一个字符串,如果要在其中查找一个子串,都有哪些方式,写出你认为最好的一个. 2.写出线程都有 ...
- [題解]luogu_P2055假期的宿舍(二分圖最大匹配)
雖然是裸題但是仍然沒有看出來...... 1.每個人都對應一張床(可以的話),這樣把人和床看成點,對應關係就是邊,跑最大匹配看匹配數量夠不夠即可 2.連邊條件:如果一個學生且不回家,那麼他可以睡自己的 ...