首页 > 代码库 > 旅游[SPFA或是最小生成树][简单算法的灵活题]

旅游[SPFA或是最小生成树][简单算法的灵活题]

旅行

【问题描述】

     Z 小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。Z 小镇附近共有N 个景点(编号为1,2,3,…,N),这些景点被M 条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z 小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车辆速度必须为Vi。

    速度变化太快使得游客们很不舒服,因此从一个景点前往另一个景点的时候,大家都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最舒适的路线。

【输入文件】

    第一行包含两个正整数,N 和M。

    接下来的M 行每行包含三个正整数:x,y 和v。表示景点x 到景点y 之间有一条双向公路,车辆必须以速度v 在该公路上行驶。

    最后一行包含两个正整数s,t,表示想知道从景点s 到景点t 最大最小速度比最小的路径。s 和t 不可能相同。

【输出文件】

    如果景点s 到景点t 没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。

【样例输入输出】

【样例输入1

4 2

1 2 1

3 4 2

1 4

【样例输入2

3 3

1 2 10

1 2 5

2 3 8

1 3

【样例输入3

3 2

1 2 2

2 3 4

1 3

【样例输出1

     IMPOSSIBLE

【样例输出2

     5/4

【样例输出3

     2

【数据范围】

    对于100%的数据,1<N≤500,1≤x,y≤N,0<v<30000,x≠y,0<M≤5000

 

 

挺好的题...

主要有两种思路吧:

1.最小生成树;

我们枚举每一条边,假设它为最小的边,于是就把小于它的边全部删掉,做一次最小生成树,容易得出最小边和最大边的比值;

 

2.SPFA;

思路和第一种很相似,同时需要枚举每一条边,spfa[i]表示,到结点为i的最大的边的值;

之后根据spfa,尽可能不更新最大的边即可;

 

代码不是很完整,先挖个坑放着好了;

因为是个好题,就先说了下思路;

旅游[SPFA或是最小生成树][简单算法的灵活题]