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 ...
随机推荐
- MAMP PRO 在osx 10.10 错误处理
新更新的osx10.10之后,启动MAMP会发现Apache无法启动, 处理如下: 1.cd /Applications/MAMP/Library/bin 2.mv envvars _envvars ...
- K380键盘IOS使用
- oracle_job进程相关学习测试
Oracle cjq0进程测试 测试流程: .CJQ进程不存在 .模拟问题处理 .问题总结 一.问题现象 CJQ0进程不存在 [root@adg1 ~]# ps -ef|grep cjq root : ...
- php json_encode() 中文保留
这几天遇到了一个问题 给java传json的时候 没有处理中文 那边拿数据的时候说不是中文的 需要转一下 方法: 实际应用中,当有中文字符时,当直接使用json_encode() 函数会使汉字不 ...
- 怎样在python中写多行语句
一般来说, 一行就是一条语句, 但有时语句过长不利于阅读, 一般会写成多行的形式, 这时需要在换行时使用反斜杠: \ name = "Lilei" age = 23 gender ...
- Golang官方log包详解
Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...
- python列表操作大全
Python列表操作大全 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且python的列 ...
- Vue列表动画----自己做的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c# 接口实现
- Linux下制作静态库 & 动态库
静态库 1.将.c生成.o文件 gcc-cadd.c-o add.o 2.使用ar工具制作静态库 ar rcs lib库名.a add.o sub.o div.o 3.编译静态库到可执行文件中 gcc ...