【题意】

  给定一张航空图, 图中顶点代表城市, 边代表 2 城市间的直通航线。 现要求找出一条满足下述限制条件的且途经城市最多的旅行路线。
(1) 从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向从东向西飞回起点(可途经若干城市) 。
(2) 除起点城市外, 任何城市只能访问 1 次。

输入文件示例
input.txt
8 9
Vancouver
Yellowknife
Edmonton
Calgary
Winnipeg
Toronto
Montreal
Halifax
Vancouver Edmonton
Vancouver Calgary
Calgary Winnipeg
Winnipeg Toronto
Toronto Halifax
Montreal Halifax
Edmonton Montreal
Edmonton Yellowknife
Edmonton Calgary

输出文件示例
output.txt
7
Vancouver
Edmonton
Montreal
Halifax
Toronto
Winnipeg
Calgary
Vancouver

【分析】

  只有我这种智障才会想半天 保证 从西向东怎么破吧。。

  都知道是怎么做的了。。。

  这种回路其实相当于从起点到终点走两次  然后路径不相交。

  不相交这一点约束了我们不能把两次路径分开做的。。  

  点只能走一遍,拆点,流量为1,费用为1.

  然后按照原图也建边。(只能从西往东走,双向边事实上只建一条)

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<cmath>
  8. #include<map>
  9. using namespace std;
  10. #define Maxn 2010
  11. #define INF 0xfffffff
  12.  
  13. map<string,int> M;
  14. int n,m;
  15.  
  16. struct node
  17. {
  18. int x,y,f,o,c,next;
  19. }t[Maxn*];int len;
  20. int first[Maxn];
  21.  
  22. int mymin(int x,int y) {return x<y?x:y;}
  23. int mymax(int x,int y) {return x>y?x:y;}
  24.  
  25. void ins(int x,int y,int f,int c)
  26. {
  27. t[++len].x=x;t[len].y=y;t[len].f=f;t[len].c=c;
  28. t[len].next=first[x];first[x]=len;t[len].o=len+;
  29. t[++len].x=y;t[len].y=x;t[len].f=;t[len].c=-c;
  30. t[len].next=first[y];first[y]=len;t[len].o=len-;
  31. }
  32.  
  33. int st,ed;
  34. queue<int > q;
  35. int dis[Maxn],pre[Maxn],flow[Maxn];
  36. bool inq[Maxn];
  37. bool bfs()
  38. {
  39. while(!q.empty()) q.pop();
  40. memset(dis,-,sizeof(dis));
  41. memset(inq,,sizeof(inq));
  42. q.push(st);dis[st]=;flow[st]=INF;inq[st]=;
  43. while(!q.empty())
  44. {
  45. int x=q.front();
  46. for(int i=first[x];i;i=t[i].next) if(t[i].f>)
  47. {
  48. int y=t[i].y;
  49. if(dis[y]<dis[x]+t[i].c)
  50. {
  51. dis[y]=dis[x]+t[i].c;
  52. pre[y]=i;
  53. flow[y]=mymin(flow[x],t[i].f);
  54. if(!inq[y])
  55. {
  56. inq[y]=;
  57. q.push(y);
  58. }
  59. }
  60. }
  61. inq[x]=;q.pop();
  62. }
  63. if(dis[ed]==-) return ;
  64. return ;
  65. }
  66.  
  67. void output()
  68. {
  69. for(int i=;i<=len;i+=)
  70. printf("%d->%d %d %d\n",t[i].x,t[i].y,t[i].f,t[i].c);
  71. printf("\n");
  72. }
  73.  
  74. void max_flow()
  75. {
  76. int ans=,sum=;
  77. while(bfs())
  78. {
  79. sum+=dis[ed]*flow[ed];
  80. ans+=flow[ed];
  81. int now=ed;
  82. while(now!=st)
  83. {
  84. t[pre[now]].f-=flow[ed];
  85. t[t[pre[now]].o].f+=flow[ed];
  86. now=t[pre[now]].x;
  87. }
  88. }
  89. if(ans<) printf("No Solution!\n");
  90. else
  91. {
  92. printf("%d\n",sum-);
  93. }
  94. }
  95.  
  96. string s[Maxn],ss;
  97. bool vis[Maxn*Maxn];
  98. void dfs(int x,bool qq)
  99. {
  100. if(x==n) return;
  101. if(x<n)
  102. {
  103. if(qq) cout<<s[x]<<endl;
  104. dfs(x+n,qq);
  105. if(!qq) cout<<s[x]<<endl;
  106. return;
  107. }
  108. for(int i=first[x];i;i=t[i].next) if(t[i].f==&&!vis[i])
  109. {
  110. vis[i]=;
  111. dfs(t[i].y,qq);
  112. return;
  113. }
  114. }
  115.  
  116. void init()
  117. {
  118. scanf("%d%d",&n,&m);
  119. for(int i=;i<=n;i++)
  120. {
  121. cin>>s[i];
  122. M[s[i]]=i;
  123. }
  124. for(int i=;i<=m;i++)
  125. {
  126. int x,y,tt;
  127. cin>>ss;
  128. x=M[ss];
  129. cin>>ss;
  130. y=M[ss];
  131. if(x==&&y==n) ins(x+n,y,,);
  132. else ins(x+n,y,,);
  133. }
  134. st=;ed=n+n;
  135. ins(,+n,,);ins(n,n+n,,);
  136. for(int i=;i<n;i++) ins(i,i+n,,);
  137. memset(vis,,sizeof(vis));
  138. }
  139.  
  140. int main()
  141. {
  142. init();
  143. max_flow();
  144. dfs(,);
  145. cout<<s[n]<<endl;
  146. dfs(,);
  147. return ;
  148. }

有没有SBJ ,桑心。。。

本机测的最长路径长度是对的,方案懒得看了,应该没什么问题吧。。

2016-11-04 19:39:24

【网络流24题】No.11(航空路线问题 最长不相交路径 最大费用流)的更多相关文章

  1. 【网络流24题】No.21 (最长 k 可重区间集问题 最长不相交路径 最大费用流)

    [] 输入文件示例input.txt4 21 76 87 109 13 输出文件示例output.txt15 [分析] 直接co题解好了,写得挺全.. [建模方法] 方法1 按左端点排序所有区间,把每 ...

  2. 【网络流24题】 No.10 餐巾计划问题 (线性规划网络优化 最小费用最大流)

    [题意] 一个餐厅在相继的 N 天里, 每天需用的餐巾数不尽相同. 假设第 i 天需要 ri 块餐巾(i=1,2,-, N). 餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部, ...

  3. 【网络流24题】No.16 数字梯形问题 (不相交路径 最大费用流)

    [题意] 给定一个由 n 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动, 形成一条从梯形的顶至底的路径.规则 1: ...

  4. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

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

    #6122. 「网络流 24 题」航空路线问题 题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单 ...

  6. 【题解】【网络流24题】航空路线问题 [P2770] [Loj6122]

    [题解][网络流24题]航空路线问题 [P2770] [Loj6122] 传送门:航空路线问题 \([P2770]\) \([Loj6122]\) [题目描述] 给出一张有向图,每个点(除了起点 \( ...

  7. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  8. 网络流基础&网络流24题

    网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...

  9. 【题解】【网络流24题】汽车加油行驶问题 [P4009] [Loj6223]

    [题解][网络流24题]汽车加油行驶问题 [P4009] [Loj6223] 传送门:汽车加油行驶问题 \([P4009]\) \([Loj6223]\) [题目描述] 给出一个 \(N \times ...

随机推荐

  1. java.util.Stack类简介

    Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...

  2. NChome如何创建单据跟主子表还有扩展开发要怎么弄?

    单据表跟主子表笔记做在笔记本里面 扩展开发在网络备份里面

  3. 浅谈C#随机数发生器

    我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机不 可 ...

  4. Android开发5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

  5. MVC小系列(三)【MVC的分部视图】

    MVC的分部视图: 分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为如果使用后者,系统会认为是一个标准视图,会为它加个默认的母版页(LayOut),除非 ...

  6. asp:时间的计算

    DataTime dt = new DataTime();//dt为时间DataTime对象 dt.ToString();//2005-11-5 13:47:04 dt.AddYears(1).ToS ...

  7. CustomEditor的文件要放在Assets/Editor目录下

    using UnityEditor; using UnityEngine; [CustomEditor(typeof(test))] public class testEditor : Editor ...

  8. 鼠标操作[OpenCV 笔记10]

    ) winname 窗口名字 onMouse 指定窗口每次鼠标事件发生的时候,被调用的函数指针.函数的原型应为void Foo(int event, int x, int y, int flags, ...

  9. Spring in action笔记

    耦合的两面性     一方面代码耦合难以测试,会出现打地鼠式的bug特性(修复一个bug,引发另一个bug) 另一方面耦合又是必须的,不同的类必须要进行适当的交互,才能实现功能. bean的四种装配方 ...

  10. JS进制转换,浮点数相加,数字判断

    document.write("整数转换函数:parseInt(数据,底数)<br>"); document.write("10101=>" ...