最小费用最大流 ---- 2017icpc青岛现场赛 K Our Journey of Xian Ends (拆点控制原图点度 + 中间必经过的点设置成源点 + 起点设成汇点)
题目链接
题目大意:
题目贼恶心难读
就是你出发地是"Xian"西安,现在你要出发到上海然后再去青岛,然后回到上海
飞机场限制:就是每个机场只能降落和起飞一次
上海的限制:上海有两个机场,叫虹桥和浦东机场,你要是要是降落在浦东机场只能到虹桥出发去青岛并且你最后还要回到虹桥再回到浦东!!
如果是降落在虹桥就没有限制,你最后回到浦东机场就好了
给你所有的航线信息:问你最小花费是多少?
解题思路:
首先要最小花费那么肯定要最小费用流
对于每个飞机场只能起飞降落一次我们可以进行拆点进行限制:
每个点uuu拆成u和u′u和u'u和u′分别是入点和出点表示之间连接流量为1,费用为0的边
然后就是我们看看路线有多少种?
- 西安->虹桥->青岛->浦东
- 西安->浦东->虹桥->青岛->虹桥->浦东
那么就是两种路径
我们是不是把在原图建立双向边然后跑最大流就好了呢?源点连向西安,汇点连向上上海呢?
肯定不是!!
我们看看这样跑出什么结果!!
它会跑出直接从西安到浦东的结果的最大流那就不对了无法确定是否经过青岛?
我们观察一下合法路径长啥样?
想想我们之前的建图是不不保证一定经过青岛
那么我们可以这样给青岛连一个源点
那么整个图就会被切成两部分,然后我们再给浦东和虹桥连接汇点,那么最大流跑出来的结果就是上半部分的选的路径拼下半边的路径:就是青岛到虹桥的路径和浦东的路径+西安到这两个点的路径
本质上就是只考虑路径覆盖不考虑路径方向
通过观察上图
首先我们知道青岛出发要发出两条边那么源点向青岛发出的流量是2
西安只选一个方向走那么源点向西安的发的流量就是1
然后你观察上面两个汇点虹桥和浦东,虹桥无论无何都要两条边,那么它向汇点连流量为2的边,浦东最多连接1条边那么就是连接流量为1的边
其他的边就是把点拆成两个就行了!!建的图和原图是一样的
AC code
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e4+8;
const int INF=0x7f7f7f7f;
struct fuck{int u,v,cap,w,next;
}edge[maxn<<4];
int head[maxn<<1];
int tol;
void init()
{tol=0;memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w,int cap)
{edge[tol].u=u;edge[tol].v=v;edge[tol].cap=cap;edge[tol].w=w;edge[tol].next=head[u];head[u]=tol++;edge[tol].u=v;edge[tol].v=u;edge[tol].w=-w;edge[tol].cap=0;edge[tol].next=head[v];head[v]=tol++;
}
map<string,int> mp;
int idx;
int getid(char s[])
{if(mp.count(s)!=0)return mp[s];mp[s]=idx;addedge(idx*2-1,idx*2,0,1);idx++;return idx-1;
}
int dis[maxn<<1],pre[maxn<<1];
bool vis[maxn<<1];
bool spfa(int sour,int sink)
{queue<int> q;q.push(sour);memset(dis,INF,sizeof(dis));memset(vis,false,sizeof(vis));dis[sour]=0;vis[sour]=true;pre[sour]=-1;int i,u,v;while(!q.empty()){u=q.front();q.pop();vis[u]=false;for(i=head[u];i!=-1;i=edge[i].next){v=edge[i].v;if(edge[i].cap>0&&edge[i].w+dis[u]<dis[v]){dis[v]=dis[u]+edge[i].w;pre[v]=i;if(!vis[v])vis[v]=true,q.push(v);}}}if(dis[sink]>=INF) return false;return true;
}
void Minicost(int sour,int sink)
{int co,fl;co=fl=0;while(spfa(sour,sink)){int mi=INF;for(int i=pre[sink];i!=-1;i=pre[edge[i^1].v]){if(mi>edge[i].cap)mi=edge[i].cap;}for(int i=pre[sink];i!=-1;i=pre[edge[i^1].v]){edge[i].cap-=mi;edge[i^1].cap+=mi;}fl+=mi;co+=dis[sink]*mi;}if(fl==3)printf("%d\n",co);elseprintf("-1\n");
}
int main()
{int t;scanf("%d",&t);while(t--){int m;scanf("%d",&m);init();idx=1;mp.clear();mp["Xian"]=idx;addedge(idx*2-1,idx*2,0,1);idx++;mp["Qingdao"]=idx;addedge(idx*2-1,idx*2,0,2);idx++;mp["Hongqiao"]=idx;addedge(idx*2-1,idx*2,0,2);idx++;mp["Pudong"]=idx;addedge(idx*2-1,idx*2,0,1);idx++;while(m--){char s[12],c[12];int w;scanf("%s%s%d",s,c,&w);int u=getid(s);int v=getid(c);addedge(u*2,v*2-1,w,INF);addedge(v*2,u*2-1,w,INF);}int sour=0,sink=idx*2-1;addedge(sour,3*2-1,0,2);addedge(sour,4*2-1,0,1);addedge(1*2,sink,0,1);addedge(2*2,sink,0,2);Minicost(sour,sink);}return 0;
}
最小费用最大流 ---- 2017icpc青岛现场赛 K Our Journey of Xian Ends (拆点控制原图点度 + 中间必经过的点设置成源点 + 起点设成汇点)相关推荐
- BZOJ 1061 志愿者招募(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1061 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管.布 ...
- 乌鲁木齐网络赛J题(最小费用最大流模板)
ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报 分类: 网络流(33) 版权声 ...
- 2018ACM上海大都会赛: I. Matrix Game(最小费用最大流)
题目描述 At the start of the matrix game, we have an N x M matrix. Each grid has some balls. The grid in ...
- 【最小费用最大流(改进Dijkstra)】2016 icpc 青岛 G - Coding Contest
题目:https://vjudge.net/contest/412116#problem/G 题意:t组样例,n个点,每个点有sis_isi个人和bib_ibi份物资.m条边,每条边从第二次开始, ...
- POJ - 2516 Minimum Cost 最小费用最大流
题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...
- pku The Windy's KM最小权匹配 or 最小费用最大流
http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...
- c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...
目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...
- 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)
题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai,ai+n一个点为入点,一个为出点这条边的流量范围 ...
- 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)
题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...
最新文章
- linux 进程监听服务 monit 简介
- Tensorflow实现MNIST数据自编码(3)
- pycharm 自动生成文件注释和函数注释
- 8.1-8.5 shell介绍,命令历史,命令补全和别名,通配符,输入输出重定向
- 手机和邮箱的正则表达式
- [嵌入式][分享][交流]发布一个消息地图的模块
- 如何让char不要忽略开头的空格_如何使用C语言实现JSON解析库(二)
- JDK1.7的HashMap的put(key, value)源码剖析
- Git 使用文档( git pull/fetch )
- 报错:/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.29.5/UITableView.m:7943解决方法
- 搞定短视频!批量下载快手视频(附源码)
- Mac上安装Mysql配置文件的添加及修改配置文件
- 同一wifi下电脑共享文件夹
- ueditor编辑器二次开发与优化
- python 阮一峰_阮一峰关于 Javascript 中闭包的解读是否正确?
- 更好的 java 重试框架 sisyphus 的 3 种使用方式
- 平面三角形与三角函数(1):角的度量与换算、三角函数的定义、图形与特征
- 域名管理——DNS服务
- bjca数字认证那个垃圾公司,做的垃圾客户端
- 机器学习--使用朴素贝叶斯进行垃圾邮件分类