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 ...
随机推荐
- CH09 开机自动烧录QSPI
版本信息: 版本 REV2018 时间 05/22/2018 XILINX ZYNQ LINUX篇 基于米联MZ7X系列 电子版自学资料 常 ...
- Scratch(二)来不及解释了,马上开始编程游戏
来来来,上一期你们都经过了”HelloWorld”神咒的加持,已入编程大门,我们今天就开始一边做游戏,一边熟悉Scratch. “我只是切出去抢了个红包,一回来就到了编程游戏的环节了?” 对,你没跑错 ...
- vue+iview+mock模拟数据遍历
下载安装iview, 进入根目录,用命令行启动 npm install npm run build npm run dev 安装mock.js和axios npm install mock.js -s ...
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择.而在 DevOps 中,我们需要将各种后端/前端 ...
- ArcGIS SOE开发异常之 ClassFactory cannot supply requested class
最近SOE开发一个功能,辛辛苦苦写完, 异常: ClassFactory cannot supply requested class 辛苦解决: 百度一下,描述这个问题的帖子很多,不过内容基本一致.大 ...
- Arm-Linux 移植 ssh
背景: 自己拥有一块开发板,但是苦于上面没有ssh,比较不方便.正好趁这个机会,移植ssh.我们使用的ssh是openssh. host平台 :Ubuntu 18.04 arm平台 : S5P6818 ...
- Advanced REST Client 的安装
1.解压Advanced-REST-client_v3.1.9.zip到当前文件夹,得到Advanced-REST-client_v3.1.9目录 2.在Chrome浏览器中打开:chrom ...
- Visual Studio 2013/15/17小技巧
1.Ctrl + F10 可以直接运行到光标处,而不用F10 逐过程 F11 逐语句了 2.当有多个断点时,按F5可以切换到下一个断点. 3.Ctrl+Shift+空格 显示函数签名,上下键可以查看所 ...
- OSI协议与TCP\IP协议之间的关系
OSI协议 TCP\IP协议 五层协议(学习参考) 应用层 应用层 应用层 表示层 会话层 运输层 运输层 运输层 网络层 网络层 网络层 数据链路层 网络接口层 数据链路层 物理层 物理层 基于五层 ...
- eval函数和isNaN函数
(一)eval函数定义:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. (二)语法:eval(string)string必需. (三)返回值:通过计算 string ...