#6122. 「网络流 24 题」航空路线问题

题目描述

给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线。现要求找出一条满足下述限制条件的且途经城市最多的旅行路线。

  1. 从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向从东向西飞回起点(可途经若干城市)。
  2. 除起点城市外,任何城市只能访问一次。

对于给定的航空图,试设计一个算法找出一条满足要求的最佳航空旅行路线。

输入格式

第一行有两个正整数 NNN 和 VVV,NNN 表示城市数,VVV 表示直飞航线数。
接下来的 NNN 行中每一行是一个城市名,可乘飞机访问这些城市。城市名出现的顺序是从西向东。也就是说,设 i,ji,ji,j 是城市表列中城市出现的位置次序,当 i>ji>ji>j 时,表示 城市 iii在城市 jjj 的东边,而且不会有两个城市在同一条经线上。城市名是一个长度不超过 151515 的字符串,串中的字符可以是大小写字母或阿拉伯数字。例如,AGR34\text{AGR34}AGR34 或 BEL4\text{BEL4}BEL4。
再接下来的 VVV 行中,每行有两个城市名,中间用空格隔开,如 city1 city2\text{city1 city2}city1 city2 表示 city1\text{city1}city1 到 city2\text{city2}city2 有一条直通航线,从 city2\text{city2}city2 到 city1\text{city1}city1 也有一条直通航线。

输出格式

输出最佳航空旅行路线。
第一行是旅行路线中所访问的城市总数 MMM。
接下来的 M+1M+1M+1 行是旅行路线的城市名,每行一个。首先是出发城市名,然后按访问顺序列出其它城市名。注意,最后一行(终点城市)的城市名必然是出发城市名。如果有多组最优解,输出任意一组均可;如果问题无解,则输出 No Solution!

样例

样例输入

  1. 8 9
  2. Vancouver
  3. Yellowknife
  4. Edmonton
  5. Calgary
  6. Winnipeg
  7. Toronto
  8. Montreal
  9. Halifax
  10. Vancouver Edmonton
  11. Vancouver Calgary
  12. Calgary Winnipeg
  13. Winnipeg Toronto
  14. Toronto Halifax
  15. Montreal Halifax
  16. Edmonton Montreal
  17. Edmonton Yellowknife
  18. Edmonton Calgary

样例输出

  1. 7
  2. Vancouver
  3. Edmonton
  4. Montreal
  5. Halifax
  6. Toronto
  7. Winnipeg
  8. Calgary
  9. Vancouver

数据范围与提示

对于所有数据,N<100N < 100N<100

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<map>
  5. #include<queue>
  6. #define maxn 110
  7. using namespace std;
  8. int dis[maxn],head[maxn],n,m,S,T,num=,ans;
  9. bool v[maxn],vis[maxn];
  10. map<string,int>p;
  11. struct node{int to,pre,v,w;}e[maxn*maxn];
  12. struct Node{int e,v;}pre[maxn*maxn];
  13. string pp[maxn],s1,s2;
  14. void Insert(int from,int to,int v,int w){
  15. e[++num].to=to;e[num].v=v;e[num].w=w;e[num].pre=head[from];head[from]=num;
  16. e[++num].to=from;e[num].v=;e[num].w=-w;e[num].pre=head[to];head[to]=num;
  17. }
  18. bool spfa(int x){
  19. memset(dis,,sizeof(dis));
  20. memset(vis,,sizeof(vis));
  21. queue<int>q;
  22. q.push(x);vis[x]=;
  23. while(!q.empty()){
  24. int now=q.front();q.pop();vis[now]=;
  25. for(int i=head[now];i;i=e[i].pre){
  26. int to=e[i].to;
  27. if(e[i].v>&&dis[now]+e[i].w>dis[to]){
  28. dis[to]=dis[now]+e[i].w;
  29. pre[to].e=i;pre[to].v=now;
  30. if(!vis[to]){vis[to]=;q.push(to);}
  31. }
  32. }
  33. }
  34. return dis[T];
  35. }
  36. int max_flow(int f){
  37. int res=,d;
  38. while(f){
  39. if(!spfa(S))return -;
  40. d=f;
  41. for(int i=T;i!=S;i=pre[i].v)d=min(e[pre[i].e].v,d);
  42. res+=d*dis[T];f-=d;
  43. for(int i=T;i!=S;i=pre[i].v){
  44. e[pre[i].e].v-=d;
  45. e[pre[i].e^].v+=d;
  46. }
  47. }
  48. return res;
  49. }
  50. int main(){
  51. scanf("%d%d",&n,&m);
  52. S=,T=n*;
  53. for(int i=;i<=n;i++){
  54. cin>>pp[i];
  55. p[pp[i]]=i;
  56. }
  57. for(int i=;i<=m;i++){
  58. cin>>s1>>s2;
  59. int a1=p[s1],a2=p[s2];
  60. if(a1>a2)swap(a1,a2);
  61. if(a1==&&a2==n)Insert(a1+n,a2,,);
  62. else Insert(a1+n,a2,,);
  63. }
  64. Insert(S,+n,,);
  65. Insert(n,T,,);
  66. for(int i=;i<n;i++)Insert(i,i+n,,);
  67. ans=max_flow();
  68. if(ans<){
  69. puts("No Solution!");
  70. return ;
  71. }
  72. printf("%d\n",ans-);
  73. cout<<pp[]<<endl;
  74. for(int i=head[S+n];i;i=e[i].pre)
  75. if(!e[i].v&&!(i&)){
  76. int to=e[i].to;
  77. while(to){
  78. cout<<pp[to]<<endl;
  79. v[to]=;
  80. int j;
  81. for(j=head[to+n],to=;j;j=e[j].pre)
  82. if(!e[j].v&&!(j&)){
  83. to=e[j].to;break;
  84. }
  85. }
  86. break;
  87. }
  88. for(int i=head[T-n];i;i=e[i].pre)
  89. if(!e[i^].v&&(i&)&&!v[e[i].to-n]){
  90. int to=e[i].to-n;
  91. while(to){
  92. cout<<pp[to]<<endl;
  93. v[to]=;
  94. int j;
  95. for(j=head[to],to=;j;j=e[j].pre)
  96. if(!e[j^].v&&(j&)){
  97. to=e[j].to-n;break;
  98. }
  99. }
  100. break;
  101. }
  102. }

loj #6122. 「网络流 24 题」航空路线问题的更多相关文章

  1. 【刷题】LOJ 6122 「网络流 24 题」航空路线问题

    题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向 ...

  2. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  3. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

  4. [LOJ#6002]「网络流 24 题」最小路径覆盖

    [LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是  ...

  5. loj #6014. 「网络流 24 题」最长 k 可重区间集

    #6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...

  6. loj #6013. 「网络流 24 题」负载平衡

    #6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...

  7. loj #6121. 「网络流 24 题」孤岛营救问题

    #6121. 「网络流 24 题」孤岛营救问题   题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂, ...

  8. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  9. [loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

    #6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

随机推荐

  1. Three.js导入gltf模型和动画

    核心代码 复杂的3D模型一般都是用第三方建模工具生成,然后加载到three中 three官方推荐使用gltf格式的文件,代表编辑器是blender 本文生成了自定义生成了一个blender模型,并且应 ...

  2. HTTP协议头域详解

    HTTP协议头域详解 Requests部分 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字符编 ...

  3. JS播放声音 兼容所有浏览器

    JS播放声音 兼容所有浏览器 <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http ...

  4. Djano + Nginx + docker配置与管理

    在配置这个服务之前,应该对docker的基本安装与使用应该很熟悉了.下面开始直接不如正题 1.让我们创建一个名为myproject的空目录,并在src名称内添加另一个文件夹.src应该包含django ...

  5. Navigator - BOM对象

    Navigator 对象 Navigator 对象包含有关浏览器的信息. 注释:没有应用于 navigator 对象的公开标准,不过所有浏览器都支持该对象. Navigator 对象集合 集合 描述 ...

  6. Apache Hive 建表操作的简单描述

    客户端连接hive [root@bigdata-02 bin]# ./beeline Beeline version by Apache Hive beeline: Connecting : Ente ...

  7. google/dense_hash_map

    这个库使用时需要注意的地方: 1.在插入数据之前,需要先调用set_empty_key()设置一个空Key,Key的值可以为任意符合类型的.但请注意之后插入的Key不能和空Key相同,否则会abort ...

  8. 把List<string>转为DataTable

    //把List<string>转为DataTable List<string> myList = new List<string>(); DataTable dt2 ...

  9. Mybatis简化sql书写,别名的使用

    之前,我们在sql映射xml文件中的引用实体类时,需要写上实体类的全类名(包名+类名),如下: <!-- 创建用户(Create) --> <insert id="addU ...

  10. 一个小仓鼠的js动画

    直接在网页打开就可以玩了: http://cdn.abowman.com/widgets/hamster/hamster.swf?up_bodyColor=f0e9cc&up_feetColo ...