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 最小费用最大流的更多相关文章

  1. Our Journey of Dalian Ends 乌鲁木齐网络赛 最小费用最大流

    Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpecte ...

  2. 2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )

    题目链接 题意 : 给出一副图,大连是起点,终点是西安,要求你求出从起点到终点且经过中转点上海的最小花费是多少? 分析 : 最短路是最小费用最大流的一个特例,所以有些包含中转限制或者经过点次数有限制的 ...

  3. 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 ...

  4. Our Journey of Xian Ends

    Our Journey of Xian Ends https://nanti.jisuanke.com/t/18521 262144K   Life is a journey, and the roa ...

  5. 网络流(最小费用最大流):POJ 2135 Farm Tour

    Farm Tour Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: ...

  6. 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 ...

  7. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...

  8. ACM 第六天

    图论 网络流 最大流 INF(初始值) 路径上权值最小的边,决定流量大小. 流量网络的三个特性: ①流量控制 ②反对称性 ③流量守恒 残余网络:保留了c(e)容量<f(e)流量[可以继续流,因为 ...

  9. POJ 2135 Farm Tour(最小费用最大流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

随机推荐

  1. mininet:使用vxlan连接两台虚拟机的网络topo

    需改虚拟机的网络适配器,将其改为host-only 尝试ping宿主机ip地址,此时能够ping同与虚拟机相连的虚拟网卡ip地址,无法ping同其他网卡ip地址 在虚拟机和宿主机中创建网络topo 在 ...

  2. Web Services使用SOAP Header

    在Web Services方法进行通信使用SOAP遵循标准的SOAP格式,该格式的一部分是在XML文档中编码的数据.XML文档包含一个Envelope根元素(由必需的Body元素和可选的Header元 ...

  3. shiro登录验证简单理解

    这两天接手了下师兄的项目,要给系统加个日志管理模块,其中需要记录登录功能的日志,那么首先要知道系统的登录是在哪里实现验证的. 该系统把所有登录验证还有权限控制的工作都交给了shiro. 这篇文章就先简 ...

  4. shell 学习笔记3-shell变量扩展

    一.特殊位置参数变量 1.特殊位置参数变量 在shell中比如:$0.$1.$#,等被称为特殊位置参数变量,当命令行.函数.脚本执行等处传递参数时,就需要使用位置参数变量 参数说明如下: 2.示例$1 ...

  5. 无法解析的外部符号 ___argc nafxcw.lib(appcore.obj)

    参考 https://blog.csdn.net/wfree/article/details/44171157 MFC的使用: 由"在静态库中使用 MFC" 改成 "在共 ...

  6. springboot_2

    1. 配置文件简介 spring boot使用一个全局配置文件:application.properties或者application.yml,放置在src/main/resources目录下或者类路 ...

  7. POJ1861(Network)-Kruskal

    题目在这 Sample Input 4 6 1 2 1 1 3 1 1 4 2 2 3 1 3 4 1 2 4 1 Sample Output 1 4 1 2 1 3 2 3 3 4 题目意思:4个点 ...

  8. Pycharm和Android工具之github使用

    请查看以下链接https://blog.csdn.net/m0_37306360/article/details/79322947 基本操作步骤 打开setting->version contr ...

  9. PCI总线学习

    PCI总线概述: 因为不实际操作了,所以就写一些方法论上的东西,纪念一下. PCI总线有三个非常显著的优点: 1. 在计算机和外设传输数据时具有更好的性能. 2. 能够尽量独立于具体的平台. 3. 可 ...

  10. 50个Sql语句实战

    /* 说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句. 问题及描述:--1.学生表Student(S#,Sname,Sage,Ssex) --S# 学生编号,Sname 学生 ...