【网络流24题】No.11(航空路线问题 最长不相交路径 最大费用流)
【题意】
给定一张航空图, 图中顶点代表城市, 边代表 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.
然后按照原图也建边。(只能从西往东走,双向边事实上只建一条)
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<cmath>
- #include<map>
- using namespace std;
- #define Maxn 2010
- #define INF 0xfffffff
- map<string,int> M;
- int n,m;
- struct node
- {
- int x,y,f,o,c,next;
- }t[Maxn*];int len;
- int first[Maxn];
- int mymin(int x,int y) {return x<y?x:y;}
- int mymax(int x,int y) {return x>y?x:y;}
- void ins(int x,int y,int f,int c)
- {
- t[++len].x=x;t[len].y=y;t[len].f=f;t[len].c=c;
- t[len].next=first[x];first[x]=len;t[len].o=len+;
- t[++len].x=y;t[len].y=x;t[len].f=;t[len].c=-c;
- t[len].next=first[y];first[y]=len;t[len].o=len-;
- }
- int st,ed;
- queue<int > q;
- int dis[Maxn],pre[Maxn],flow[Maxn];
- bool inq[Maxn];
- bool bfs()
- {
- while(!q.empty()) q.pop();
- memset(dis,-,sizeof(dis));
- memset(inq,,sizeof(inq));
- q.push(st);dis[st]=;flow[st]=INF;inq[st]=;
- while(!q.empty())
- {
- int x=q.front();
- for(int i=first[x];i;i=t[i].next) if(t[i].f>)
- {
- int y=t[i].y;
- if(dis[y]<dis[x]+t[i].c)
- {
- dis[y]=dis[x]+t[i].c;
- pre[y]=i;
- flow[y]=mymin(flow[x],t[i].f);
- if(!inq[y])
- {
- inq[y]=;
- q.push(y);
- }
- }
- }
- inq[x]=;q.pop();
- }
- if(dis[ed]==-) return ;
- return ;
- }
- void output()
- {
- for(int i=;i<=len;i+=)
- printf("%d->%d %d %d\n",t[i].x,t[i].y,t[i].f,t[i].c);
- printf("\n");
- }
- void max_flow()
- {
- int ans=,sum=;
- while(bfs())
- {
- sum+=dis[ed]*flow[ed];
- ans+=flow[ed];
- int now=ed;
- while(now!=st)
- {
- t[pre[now]].f-=flow[ed];
- t[t[pre[now]].o].f+=flow[ed];
- now=t[pre[now]].x;
- }
- }
- if(ans<) printf("No Solution!\n");
- else
- {
- printf("%d\n",sum-);
- }
- }
- string s[Maxn],ss;
- bool vis[Maxn*Maxn];
- void dfs(int x,bool qq)
- {
- if(x==n) return;
- if(x<n)
- {
- if(qq) cout<<s[x]<<endl;
- dfs(x+n,qq);
- if(!qq) cout<<s[x]<<endl;
- return;
- }
- for(int i=first[x];i;i=t[i].next) if(t[i].f==&&!vis[i])
- {
- vis[i]=;
- dfs(t[i].y,qq);
- return;
- }
- }
- void init()
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)
- {
- cin>>s[i];
- M[s[i]]=i;
- }
- for(int i=;i<=m;i++)
- {
- int x,y,tt;
- cin>>ss;
- x=M[ss];
- cin>>ss;
- y=M[ss];
- if(x==&&y==n) ins(x+n,y,,);
- else ins(x+n,y,,);
- }
- st=;ed=n+n;
- ins(,+n,,);ins(n,n+n,,);
- for(int i=;i<n;i++) ins(i,i+n,,);
- memset(vis,,sizeof(vis));
- }
- int main()
- {
- init();
- max_flow();
- dfs(,);
- cout<<s[n]<<endl;
- dfs(,);
- return ;
- }
有没有SBJ ,桑心。。。
本机测的最长路径长度是对的,方案懒得看了,应该没什么问题吧。。
2016-11-04 19:39:24
【网络流24题】No.11(航空路线问题 最长不相交路径 最大费用流)的更多相关文章
- 【网络流24题】No.21 (最长 k 可重区间集问题 最长不相交路径 最大费用流)
[] 输入文件示例input.txt4 21 76 87 109 13 输出文件示例output.txt15 [分析] 直接co题解好了,写得挺全.. [建模方法] 方法1 按左端点排序所有区间,把每 ...
- 【网络流24题】 No.10 餐巾计划问题 (线性规划网络优化 最小费用最大流)
[题意] 一个餐厅在相继的 N 天里, 每天需用的餐巾数不尽相同. 假设第 i 天需要 ri 块餐巾(i=1,2,-, N). 餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部, ...
- 【网络流24题】No.16 数字梯形问题 (不相交路径 最大费用流)
[题意] 给定一个由 n 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动, 形成一条从梯形的顶至底的路径.规则 1: ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
- loj #6122. 「网络流 24 题」航空路线问题
#6122. 「网络流 24 题」航空路线问题 题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单 ...
- 【题解】【网络流24题】航空路线问题 [P2770] [Loj6122]
[题解][网络流24题]航空路线问题 [P2770] [Loj6122] 传送门:航空路线问题 \([P2770]\) \([Loj6122]\) [题目描述] 给出一张有向图,每个点(除了起点 \( ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- 网络流基础&网络流24题
网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...
- 【题解】【网络流24题】汽车加油行驶问题 [P4009] [Loj6223]
[题解][网络流24题]汽车加油行驶问题 [P4009] [Loj6223] 传送门:汽车加油行驶问题 \([P4009]\) \([Loj6223]\) [题目描述] 给出一个 \(N \times ...
随机推荐
- java.util.Stack类简介
Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...
- NChome如何创建单据跟主子表还有扩展开发要怎么弄?
单据表跟主子表笔记做在笔记本里面 扩展开发在网络备份里面
- 浅谈C#随机数发生器
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机不 可 ...
- Android开发5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
- MVC小系列(三)【MVC的分部视图】
MVC的分部视图: 分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为如果使用后者,系统会认为是一个标准视图,会为它加个默认的母版页(LayOut),除非 ...
- asp:时间的计算
DataTime dt = new DataTime();//dt为时间DataTime对象 dt.ToString();//2005-11-5 13:47:04 dt.AddYears(1).ToS ...
- CustomEditor的文件要放在Assets/Editor目录下
using UnityEditor; using UnityEngine; [CustomEditor(typeof(test))] public class testEditor : Editor ...
- 鼠标操作[OpenCV 笔记10]
) winname 窗口名字 onMouse 指定窗口每次鼠标事件发生的时候,被调用的函数指针.函数的原型应为void Foo(int event, int x, int y, int flags, ...
- Spring in action笔记
耦合的两面性 一方面代码耦合难以测试,会出现打地鼠式的bug特性(修复一个bug,引发另一个bug) 另一方面耦合又是必须的,不同的类必须要进行适当的交互,才能实现功能. bean的四种装配方 ...
- JS进制转换,浮点数相加,数字判断
document.write("整数转换函数:parseInt(数据,底数)<br>"); document.write("10101=>" ...