【uva 1658】Admiral(图论--网络流 最小费用最大流)
题意:有个N个点M个边的有向加权图,求1~N的两条不相交路径(除了起点和终点外没有公共点),使得权和最小。
解法:不相交?也就是一个点只能经过一次,也就是我后面博文会讲的“结点容量问题”。(呃不,写完这博文几天后的今天,我负责任地 m(._.)m 告诉大家,我不会写这博文了......我的时间不多了...... m(_ _;;m 大家可以看蓝书。)常用方法就是拆点法,把一个点拆成两个点,中间连一条容量为1、费用为0的边。于是求1到 n 的流量为2的最小费用流就可以了。
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<queue>
6 using namespace std;
7
8 const int N=1010,M=10010,NN=2010,MM=22000,D=110,INF=(int)1e9;
9 int n,m,len;
10 int last[NN],d[NN],vis[NN],flow[NN];
11 int pre[NN],id[NN];
12 struct edge{int x,y,fl,c,next;}e[MM];
13 queue<int> q;
14
15 int mmin(int x,int y) {return x<y?x:y;}
16 void ins(int x,int y,int fl,int c)
17 {
18 e[++len].x=x,e[len].y=y,e[len].fl=fl,e[len].c=c;
19 e[len].next=last[x],last[x]=len;
20 e[++len].x=y,e[len].y=x,e[len].fl=0,e[len].c=-c;
21 e[len].next=last[y],last[y]=len;
22 }
23 bool spfa(int st,int ed)
24 {
25 while (!q.empty()) q.pop();
26 memset(d,63,sizeof(d));//>1e9
27 memset(vis,0,sizeof(vis));
28 memset(pre,0,sizeof(pre));
29 q.push(st);
30 d[st]=0,vis[st]=1,flow[st]=INF;
31 while (!q.empty())
32 {
33 int x=q.front(); q.pop();
34 vis[x]=0;//spfa
35 for (int i=last[x];i;i=e[i].next)
36 {
37 int y=e[i].y;
38 if (d[x]+e[i].c<d[y] && e[i].fl)
39 {
40 d[y]=d[x]+e[i].c;
41 flow[y]=mmin(flow[x],e[i].fl);
42 pre[y]=x, id[y]=i;
43 if (!vis[y]) q.push(y),vis[y]=1;
44 }
45 }
46 }
47 return pre[ed];
48 }
49 int Max_flow(int st,int ed)
50 {
51 int sum=0;
52 while (spfa(st,ed))
53 {
54 sum+=flow[ed]*d[ed];
55 for (int i=ed;i!=st;i=pre[i])
56 {
57 e[id[i]].fl-=flow[ed];
58 e[id[i]^1].fl+=flow[ed];
59 }
60 }
61 return sum;
62 }
63 int main()
64 {
65 while (scanf("%d%d",&n,&m)!=EOF)
66 {
67 int x,y,z; len=1;
68 memset(last,0,sizeof(last));
69 for (int i=2;i<n;i++) ins(i,n+i-1,1,0);
70 ins(n,2*n-1,2,0);
71 //拆点就是真的拆点不能ins(i,i...) n+1~2n-2
72 for (int i=1;i<=m;i++)
73 {
74 scanf("%d%d%d",&x,&y,&z);
75 if (x!=1) x=n+x-1;//只有1没有拆多一个点
76 ins(x,y,1,z);
77 }
78 //for (int i=2;i<=len;i++)
79 // printf("%d %d %d %d %d\n",e[i].x,e[i].y,e[i].fl,e[i].c,e[i].next);
80 int ans=Max_flow(1,2*n-1);
81 printf("%d\n",ans);
82 }
83 return 0;
84 }
【uva 1658】Admiral(图论--网络流 最小费用最大流)的更多相关文章
- UVA 1658 海军上将(拆点法+最小费用限制流)
海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...
- 【bzoj 2597】[Wc2007]剪刀石头布(图论--网络流 最小费用最大流)
题目:在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道于统计有多少这样的 ...
- 图论算法-最小费用最大流模板【EK;Dinic】
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...
- 网络流(最小费用最大流):POJ 2135 Farm Tour
Farm Tour Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...
- HDU 6118 度度熊的交易计划(网络流-最小费用最大流)
度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但 ...
- 网络流--最小费用最大流MCMF模板
标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #includ ...
- 洛谷P4003 [国家集训队2017]无限之环 网络流 最小费用最大流
题意简述 有一个\(n\times m\)棋盘,棋盘上每个格子上有一个水管.水管共有\(16\)种,用一个\(4\)位二进制数来表示当前水管向上.右.下.左有个接口.你可以旋转除了\((0101)_2 ...
- POJ-2516-Minimum Cost(网络流, 最小费用最大流)
链接: https://vjudge.net/problem/POJ-2516 题意: Dearboy, a goods victualer, now comes to a big problem, ...
- Minimum Cost 【POJ - 2516】【网络流最小费用最大流】
题目链接 题意: 有N个商家它们需要货物源,还有M个货物供应商,N个商家需要K种物品,每种物品都有对应的需求量,M个商家每种物品都是对应的存货,然后再是K个N*M的矩阵表示了K个物品从供货商运送到商家 ...
随机推荐
- ajax跨域访问http服务--jsonp
在前面一篇文章<Spring Cloud 前后端分离后引起的跨域访问解决方案>里我们提到使用ajax跨域请求其他应用的http服务,使用的是后台增加注解@CrossOrigin或者增加Co ...
- 诸葛 VS 庞统,拿下 Paxos 共识算法
前言 分布式确实是一个有趣的话题,只要你留心观察,分布式在生活中无处不在. 悟空哥最开始学习分布式是从一篇非常用心写的技术征文开始的,而且这篇文章获得了征文第一名,在此感谢掘金社区提供的平台.想学习的 ...
- 【栈和队列】5、队列概述与数组队列的基本实现 - Java
3-5 数组队列 简单记录 - bobo老师的玩转算法系列–玩转数据结构 - 栈和队列 队列Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另 ...
- 【Linux】snmp在message中报错: /etc/snmp/snmpd.conf: line 311: Error: ERROR: This output format has been de
Apr 17 17:36:17 localhost snmpd[2810]: /etc/snmp/snmpd.conf: line 311: Error: ERROR: This output for ...
- 负载均衡和故障转换(Failover)的连接RAC方法
TAF:Transparent Application Failover,透明的应用切换,即在切换的过程中,用户感知不到.可以实现会话的切换(无法实现事务的切换,即没有提交的事务会回滚),即在不断开连 ...
- merge join pg伪代码
Join { get initial outer and inner tuples INITIALIZE do forever { while (outer != inner) { SKIP_TEST ...
- 实现简易版德州扑克|学习麻瓜编程以项目为导向入门前端 HTML+CSS+JS
实现简易版德州扑克 1.先上达到网页效果图(简易版德州扑克) 网页分为发牌区和牌池,上面为发牌区,下面是牌池区 2. 代码实现 2.1 HTML和JS代码 ` <link rel="s ...
- Kubernetes 开船记-脚踏两只船:用 master 服务器镜像克隆出新集群
自从2020年2月23日 园子全站登船 之后,我们一边感叹"不上船不知道,一上船吓一跳" -- kubernetes 比 docker swarm 强大太多,一边有一个杞人忧天的担 ...
- mysql忽略表中的某个字段不查询
业务场景 1.表中字段较多 2.查询不需要表中某个字段的数据 语句如下: SELECT CONCAT(' select ',GROUP_CONCAT(COLUMN_NAME),' from ', TA ...
- Django-html文件实例
1.实例1,登陆界面 <!DOCTYPE html> <head> <meta http-equiv="content-type" content=& ...