Our Journey of Dalian Ends && Our Journey of Xian Ends 最小费用最大流
2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛Our Journey of Dalian Ends
题意:要求先从大连到上海,再从上海打西安,中途会经过其他城市,每个城市只能去一次,出一次,给出航班信息,问最小花费。
每个城市只能去一次,出一次,那么很明显需要对每个城市拆点,就分成入点和出点,然后如果按照题意说法,把汇点连大连和上海,然后把上海和西安连汇点,那么很明显不对,
因为跑出来的可能是从上海直接到的上海,然后大连到西安,所以不能把跟汇点和源点相连的设在同一点,那么我们就可以汇点跟上海连,大连和西安跟源点连,或者反过来也可以。
#include<cstdio>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
#include<tr1/unordered_map>
using namespace std;
const int N=2e4+,M=1e6+,inf=1e9+;
struct Side{
int v,ne,w,val;
}S[M<<];
string s1[M],s2[M];
tr1::unordered_map<string,int> mmp;
int n,sn,sb,se,head[N],ww[N],vis[N],flow[N],lu[N],dis[N];
void init(){
sn=;
sb=;se=n*+;
for(int i=sb;i<=se;i++) head[i]=-;
}
void add(int u,int v,int w,int val){
S[sn].w=w;S[sn].val=val;
S[sn].v=v;S[sn].ne=head[u];
head[u]=sn++;
}
void addE(int u,int v,int w,int val){
add(u,v,w,val);add(v,u,,-val);
}
bool spfa(){
queue<int> q;
for(int i=sb;i<=se;i++){
dis[i]=inf;
vis[i]=;
flow[i]=inf;
lu[i]=-;
}
dis[sb]=;
vis[sb]=;
q.push(sb);
int u,v;
while(!q.empty()){
u=q.front();q.pop();vis[u]=;
for(int i=head[u];~i;i=S[i].ne){
v=S[i].v;
if(S[i].w>&&dis[v]>dis[u]+S[i].val){
lu[v]=i;
dis[v]=dis[u]+S[i].val;
flow[v]=min(flow[u],S[i].w);
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
}
}
return dis[se]!=inf;
}
int mfml(){
int ans=,ansc=;
while(spfa()){
ans+=flow[se];
ansc+=flow[se]*dis[se];
for(int i=lu[se];~i;i=lu[S[i^].v]){
S[i].w-=flow[se];
S[i^].w+=flow[se];
}
}
if(ans==) return ansc;
return -;
}
int main(){
int t,m;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
n=;mmp.clear();
for(int i=;i<m;i++){
cin>>s1[i]>>s2[i]>>ww[i];
if(!mmp.count(s1[i])) mmp[s1[i]]=++n;
if(!mmp.count(s2[i])) mmp[s2[i]]=++n;
}
init();
for(int i=;i<=n;i++) addE(i,i+n,,);
addE(mmp["Shanghai"],mmp["Shanghai"]+n,,);
addE(sb,mmp["Xian"],,);
addE(sb,mmp["Dalian"],,);
addE(mmp["Shanghai"]+n,se,,);
for(int i=;i<m;i++){
addE(mmp[s1[i]]+n,mmp[s2[i]],,ww[i]);
addE(mmp[s2[i]]+n,mmp[s1[i]],,ww[i]);
}
printf("%d\n",mfml());
}
return ;
}
旅游哦
ACM-ICPC 2017 Asia QingdaoOur Journey of Xian Ends
题意:跟上面类似,不过就是变成了,上海分成了两个之间有高速路的机场,虹桥跟浦东,然后这个高速路不计入那个进出里面。
明白题意之后,可以知道路线就西安到虹桥到青岛到浦东还有西安到浦东到虹桥到青岛到虹桥到浦东,这两条。
而不管是第一条还是第二条,如果只算航班信息的话,我们都可以统一出一个建图方法,源点连虹桥,流量为2,源点连浦东,流量为1,西安连汇点,流量为1,青岛连汇点流量为2,还有要注意青岛跟虹桥间的流量应该为2,应该它可以直接通过这个航班做一个轮回。
#include<cstdio>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
#include<tr1/unordered_map>
using namespace std;
const int N=2e4+,M=1e6+,inf=1e9+;
struct Side{
int v,ne,w,val;
}S[M<<];
string s1[M],s2[M];
tr1::unordered_map<string,int> mmp;
int n,sn,sb,se,head[N],ww[N],vis[N],flow[N],lu[N],dis[N];
void init(){
sn=;
sb=;se=n*+;
for(int i=sb;i<=se;i++) head[i]=-;
}
void add(int u,int v,int w,int val){
S[sn].w=w;S[sn].val=val;
S[sn].v=v;S[sn].ne=head[u];
head[u]=sn++;
}
void addE(int u,int v,int w,int val){
add(u,v,w,val);add(v,u,,-val);
}
bool spfa(){
queue<int> q;
for(int i=sb;i<=se;i++){
dis[i]=inf;
vis[i]=;
flow[i]=inf;
lu[i]=-;
}
dis[sb]=;
vis[sb]=;
q.push(sb);
int u,v;
while(!q.empty()){
u=q.front();q.pop();vis[u]=;
for(int i=head[u];~i;i=S[i].ne){
v=S[i].v;
if(S[i].w>&&dis[v]>dis[u]+S[i].val){
lu[v]=i;
dis[v]=dis[u]+S[i].val;
flow[v]=min(flow[u],S[i].w);
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
}
}
return dis[se]!=inf;
}
int mfml(){
int ans=,ansc=;
while(spfa()){
ans+=flow[se];
ansc+=flow[se]*dis[se];
for(int i=lu[se];~i;i=lu[S[i^].v]){
S[i].w-=flow[se];
S[i^].w+=flow[se];
}
}
if(ans==) return ansc;
return -;
}
int main(){
int t,m;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
n=;mmp.clear();
for(int i=;i<m;i++){
cin>>s1[i]>>s2[i]>>ww[i];
if(!mmp.count(s1[i])) mmp[s1[i]]=++n;
if(!mmp.count(s2[i])) mmp[s2[i]]=++n;
}
init();
for(int i=;i<=n;i++) addE(i,i+n,,);
addE(mmp["Hongqiao"],mmp["Hongqiao"]+n,,);
addE(mmp["Qingdao"],mmp["Qingdao"]+n,,);
addE(sb,mmp["Pudong"],,);
addE(sb,mmp["Hongqiao"],,);
addE(mmp["Xian"]+n,se,,);
addE(mmp["Qingdao"]+n,se,,);
for(int i=,w;i<m;i++){
if(s1[i]=="Qingdao"&&s2[i]=="Hongqiao") w=;
else if(s2[i]=="Qingdao"&&s1[i]=="Hongqiao") w=;
else w=;
addE(mmp[s1[i]]+n,mmp[s2[i]],w,ww[i]);
addE(mmp[s2[i]]+n,mmp[s1[i]],w,ww[i]); }
printf("%d\n",mfml());
}
return ;
}
公费哦
Our Journey of Dalian Ends && Our Journey of Xian Ends 最小费用最大流的更多相关文章
- Our Journey of Dalian Ends 乌鲁木齐网络赛 最小费用最大流
Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpecte ...
- 2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )
题目链接 题意 : 给出一副图,大连是起点,终点是西安,要求你求出从起点到终点且经过中转点上海的最小花费是多少? 分析 : 最短路是最小费用最大流的一个特例,所以有些包含中转限制或者经过点次数有限制的 ...
- 2017 乌鲁木齐赛区网络赛 J Our Journey of Dalian Ends 费用流
题目描述: Life is a journey, and the road we travel has twists and turns, which sometimes lead us to une ...
- Our Journey of Xian Ends
Our Journey of Xian Ends https://nanti.jisuanke.com/t/18521 262144K Life is a journey, and the roa ...
- 网络流(最小费用最大流):POJ 2135 Farm Tour
Farm Tour Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...
- TZOJ 1513 Farm Tour(最小费用最大流)
描述 When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 &l ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- ACM 第六天
图论 网络流 最大流 INF(初始值) 路径上权值最小的边,决定流量大小. 流量网络的三个特性: ①流量控制 ②反对称性 ③流量守恒 残余网络:保留了c(e)容量<f(e)流量[可以继续流,因为 ...
- POJ 2135 Farm Tour(最小费用最大流)
Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...
随机推荐
- docker 实践七:docker-machine
本篇是关于 docker 三剑客中的 docker machine. 注:环境为 CentOS7,docker 19.03. docker-machine 是 docker 官方三剑客项目之一,它是一 ...
- java.lang.AbstractMethodError: null
在使用springcloud的时候运行报这个错,原因是版本冲突导致的,在idea中创建springcloud项目的时候,这里默认是${spring-cloud.version},但是如果你使用的是高版 ...
- 记录一次kafka解决相同userId顺序消费的问题
基本思路:在kafka生产者生产消息时,把相同userId的消息落在同一个分区/partition public void sendTopic1(String tpoic, String userId ...
- Mybatis:缓存
1.什么是缓存[Cache] 存在内存中的临时数据. 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统 ...
- VS2017 CMD多出 “进程 6420)已退出,返回代码为: 0”的内容
执行cmd, 命令行多出如下内容 xxxx\project.exe (进程 6420)已退出,返回代码为: 0. VS 取消设置方式: 工具->选项->调试-->常规 拉到最 ...
- 表格分页——tablePagination
背景:表格是最为通用的展示方式,为了展示的统一性,以及分页组件的重用,这里写一个分页组件,供比较多或者较少数据2种表格进行分页展示. 分页组件: <template> <el-pag ...
- 什么是软件工具开发包(SDK)
开发一个软件,需要经过编辑.编译.调试.运行几个过程. 编辑:使用编程语言编写程序代码的过程. 编译:将编写的程序进行翻译. 调试:程序不可能一次性编写成功,编写过程中难免会出现语法.语义上的错误,调 ...
- Computer Vision_33_SIFT:A novel coarse-to-fine scheme for automatic image registration based on SIFT and mutual information——2014
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- [dev][ipsec][esp] ipsec链路中断的感知问题
ipsec如何感知到链路中断了?以下内容讲的是在没有配置DPD,且没有rekey的场 景下. 1. ESP认为,以下两个场景交由应用层来感知,应用层会发现ipsec的连接坏掉了. a,ESP承载的连接 ...
- Notes for <<Thinking In Java>>
String Thus, when you create a toString( ) method, if the operations are simple ones that the comp ...