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 ...
随机推荐
- 两个gif图片动画效果
<div className="uploading-animation-tip-wrap"> <img src={require('~/shared/assets ...
- linux命令行删除N天前的数据的命令
命令: find . -mtime +N -type f -name "*.log.*" -exec rm -f {} \; 简单解释: find .查询 ; -mtime 规 ...
- shell 学习笔记8-case条件语句
一.case语句简介 1.什么是case条件语句 case条件语句就相当于多分支的if/elif/else条件语句,但是比这样的语句更规范更好看,经常被用在失效系统服务启动脚本等企业应用中 程序将ca ...
- Golang安装和配置
Golang安装和配置 Linux Golang 下载源码,解压. # /home/superpika为你的主目录 mkdir /home/superpika/go mkdir /home/super ...
- vue动态请求到的多重数组循环遍历,取值问题,如果某个值存在则显示,不存在则不显示。
数据结构: 需求:我在vue页面需要拿到url值并显示图片 代码写法: 注意:一定要判断否则拿到的large对象一直是空值, 那么img.large.url将会取不到值,会报 url 'undefi ...
- 【完整篇】orangepi香橙派新手入门之被官方坑
图片特意缩小,看不清请打开另一个窗口查看原图. 第一步:烧录系统,我烧录的是Ubuntu_Desktop[请注意!!!!用户名是错的!!用户名是错的!!用户名是错的!!] 正确的用户名是orangep ...
- 七年总结常用 Git 命令清单
我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...
- Android笔记 (一) 第一次接触Android
1.下载android SDK 访问http://developer.android.com/ → GET THE SDK → Installing the Android SDK → STAN ...
- OpenStack环境搭建
实验环境 CentOS-7-x86_64-Minimal-1708.iso openstack_N.tar.gz 创建虚拟机 controller部署 computer网络配置 OpenStack环境 ...
- OF框架使用指导系列索引
一.项目搭建指导 [OF框架]搭建标准工作环境 [OF框架]使用OF框架创建应用项目 [OF框架]在Visual Studio中启用Docker支持,编译生成,并在容器运行项目 [OF框架]在Visu ...