城市交通 NOI C++

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了城市交通 NOI C++相关的知识,希望对你有一定的参考价值。

某城市有n(1≤n≤50)个街区,某些街区由公共汽车线路相连,如在下图中,街区1,2有一条公共汽车线路相连,且由街区1至街区2的时间为34分钟。由于街区与街区之间的距离较近,与等车时间相比可忽略不记,所以这个时间为两趟公共汽车的间隔时间,即平均的等车时间。
由街区1至街区5的最快走法为1-3-5,总时间为44分钟。
例图:
0 34 24 0 0
34 0 10 12 0
24 10 0 16 20
0 12 16 0 30
0 0 20 30 0

现在市政府为了提高城市交通质量,决定加开m(1≤m≤10)条公共汽车线路。若在某两个街区a,b之间加开线路(前提是a、b之间必须已有线路),则从a到b的旅行时间缩小为原来的一半(距离未变,只是等车的时间缩短了一半)。例如,若在1,2之间加开一条线路,则时间变为17分钟,加开两条线路,时间变为8.5分钟,以此类推。所有的线路都是环路,即如果由1至2的时间变为17分钟,则由2至1的时间也变为17分钟。

求加开某些线路,能使由城市1至城市n的时间最少。例如,在上图中,如果m=2,则改变1-3,3-5的线路,总的时间可以减少为22分钟。
输入:第一行为城市数n与加开线路数m;第二行至第n+1行,每行为n个实数,第i+1行第j列表示由城市i到城市j的时间。如果时间为0,则城市i不可能到城市j。
注意:输入数据中,从城市1到城市n至少有一条路线。
输出:第一行为由城市1到城市n的最小时间X(保留小数点后两位);第二行至第m+1行为更改的线路。每行由两个整数(x,y)构成。表示将城市x与城市y之间增加一条线路

附:此图中起点与终点间只有一个站,若有多个站,算法是否会有不同?

分析:《城市交通》问题的图论模型很简单。如果只考虑从城市1到城市n的最少时间,那么,这个问题就是一道经典的最短路径问题。因此,这个问题乍看上去,就给人一种熟悉的感觉。而实质呢?问题的“变数”在于市政府的改革措施很奇特(每加一条公共汽车路线,两个街区之间的旅行时间就缩短为原来的一半),这就弄得人不知所措。是否是关键路径的问题??显然,这个改革不能分步执行,即它不具有“贪心法”的要求,而如果采用搜索的方法,时间效率会很低。那么该如何解决呢?
还是采用Floyd-Warshall的算法思想。在计算增加m条边的最优解(使最短路下降最快)的过程中,我们同样可以发现:
1、将道路a-b上增加的m条边可以分为如下两个问题(如果k是最短路上的一点)
1. ⑴求a-k增加t条边;
2. ⑵求k-b增加m-t条边。
t可以取从0至m的任意值。问题a-b增加m条边的最优解取决与这两个子问题的最优解。
2、在求m条边的过程中,始终只与增加t条边与增加m-t条边的子问题发生联系。

以上两个特点即为“无后效性”与“最优子问题”。所以,“城市交通”问题可采用动态程序设计方法。设
val[a,b,m]的值为增加m条线路后城市a到城市b的最短路长。其中val[a,b,0]的值为原交通图中边城市a至城市b的最短路,可以直接使用floyd算法计算;
val[a,b,m]=minval[a,k,t]+val[k,b,m-t](其中t为从0到m中的一个数,k为a到b中间的一点)
参考技术A 可以直接在dijkstra里面加一小段,,吧。。。

以上是关于城市交通 NOI C++的主要内容,如果未能解决你的问题,请参考以下文章

[NOI2013]快餐店

bzoj3242 [Noi2013]快餐店

bzoj 3242: [Noi2013]快餐店

BZOJ3242UOJ#126NOI2013快餐店

BZOJ3242 [Noi2013]快餐店/UOJ126

bzoj 3672: [Noi2014]购票