博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017ACM-ICPC 青岛 K.Our Journey of Xian Ends
阅读量:7282 次
发布时间:2019-06-30

本文共 2347 字,大约阅读时间需要 7 分钟。

题意很难读。比赛时读了半个小时,赛后又读了一个小时,还是有些模棱两可。最后又问了问,大概知道是什么意思了。

就是给定一些航班,每个航班双向连接一对城市。要求从西安出发,必须先到达上海然后到达青岛,然后从青岛回到上海浦东机场的最小费用

其中,每个机场有登机区和降落区,每个机场的登机区和降落区都只能经过一次。上海有浦东机场和虹桥机场两个,两个机场间可以不坐飞机并且不消耗费用

对于点容量限制,可以通过拆点来限制点容量,这是基本操作

对于路径限制,可以通过源点汇点的设定来做到。若最大流为满则存在路径

#include
using namespace std;const int maxn=2e4+8;const int INF=0x7f7f7f7f;struct fuck{ int u,v,cap,w,next;}edge[maxn<<4];int head[maxn<<1];int tol;void init(){ tol=0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int w,int cap){ edge[tol].u=u; edge[tol].v=v; edge[tol].cap=cap; edge[tol].w=w; edge[tol].next=head[u]; head[u]=tol++; edge[tol].u=v; edge[tol].v=u; edge[tol].w=-w; edge[tol].cap=0; edge[tol].next=head[v]; head[v]=tol++;}map
mp;int idx;int getid(char s[]){ if(mp.count(s)!=0) return mp[s]; mp[s]=idx;addedge(idx*2-1,idx*2,0,1);idx++; return idx-1;}int dis[maxn<<1],pre[maxn<<1];bool vis[maxn<<1];bool spfa(int sour,int sink){ queue
q; q.push(sour); memset(dis,INF,sizeof(dis)); memset(vis,false,sizeof(vis)); dis[sour]=0;vis[sour]=true;pre[sour]=-1; int i,u,v; while(!q.empty()) { u=q.front();q.pop(); vis[u]=false; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(edge[i].cap>0&&edge[i].w+dis[u]
=INF) return false; return true;}void Minicost(int sour,int sink){ int co,fl; co=fl=0; while(spfa(sour,sink)) { int mi=INF; for(int i=pre[sink];i!=-1;i=pre[edge[i^1].v]){ if(mi>edge[i].cap) mi=edge[i].cap; } for(int i=pre[sink];i!=-1;i=pre[edge[i^1].v]){ edge[i].cap-=mi; edge[i^1].cap+=mi; } fl+=mi; co+=dis[sink]*mi; } if(fl==3) printf("%d\n",co); else printf("-1\n");}int main(){ int t; scanf("%d",&t); while(t--) { int m; scanf("%d",&m); init();idx=1; mp.clear(); mp["Xian"]=idx;addedge(idx*2-1,idx*2,0,1);idx++; mp["Qingdao"]=idx;addedge(idx*2-1,idx*2,0,2);idx++; mp["Hongqiao"]=idx;addedge(idx*2-1,idx*2,0,2);idx++; mp["Pudong"]=idx;addedge(idx*2-1,idx*2,0,1);idx++; while(m--) { char s[12],c[12]; int w; scanf("%s%s%d",s,c,&w); int u=getid(s); int v=getid(c); addedge(u*2,v*2-1,w,INF); addedge(v*2,u*2-1,w,INF); } int sour=0,sink=idx*2-1; addedge(sour,3*2-1,0,2); addedge(sour,4*2-1,0,1); addedge(1*2,sink,0,1); addedge(2*2,sink,0,2); Minicost(sour,sink); } return 0;}

 

转载于:https://www.cnblogs.com/bitch1319453/p/8046738.html

你可能感兴趣的文章
LAMP报PDO的错怎么办?
查看>>
shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量
查看>>
Network Based Application Recognition (NBAR) 网络应用程序识别
查看>>
Linux服务器性能评估与优化、监控利器---dstat应用
查看>>
linux添加新硬盘、格式化以及自动挂载
查看>>
SQLSERVER备份脚本
查看>>
zabbix 自动发现 tomcat日志异常文件数量
查看>>
javascript的正则表达式
查看>>
windows服务器远程桌面(rdpclip.exe)的妙用
查看>>
使用inotify监视Linux文件变化
查看>>
SQLite第八课 auth.c授权文件解析
查看>>
nginx日志切割
查看>>
配置Samba服务器
查看>>
AIX内存性能优化和监视
查看>>
haproxy根据客户端浏览器进行跳转
查看>>
12c DataGuard switchover to 'primary'
查看>>
Django返回json数据
查看>>
在Linq to Entity 中使用lambda表达式来实现Left Join和Join
查看>>
Linux自学笔记——http协议进阶及httpd配置(2)
查看>>
Linux必会原理之软连接文件和硬链接文件的区别
查看>>