您的位置:首页 > 其它

2009东莞特长生 Q3:导游的魔棒

2018-03-23 19:42 288 查看
三、 导游的魔棒

提交文件: c.pas / c.exe

输入文件: c.in

输出文件: c.out

问题描述:

小C“五一”节参加了五星旅行社组织的一次外出旅游,这次旅游中,小C遇到一件非常有趣的事: 五星旅行社的导游小张有一根魔棒,这根魔棒在每一次的旅游中可以产生一次魔力(也只能产生一次魔力),这魔力可以使两个景点间的距离减成原来的一半。小C在“五一”节的这次旅游中,很有幸是小张导游作为他们的导游,小张当然也没有忘记带他的魔棒,因为他可以发挥魔棒的作用,使路程减少呢。这次旅游中,去了一个有N个景点的旅游区,这个旅游区只有一个入口,在景点编号为1的地方,一个出口,在景点编号为N的地方,景点编号为1,2,3,…,N。在入口处有一个N×N的数据阵,描述了景点间的距离,a[I,j]表示景点i到景点j的距离。因为小C的公司有急事要小C尽快回来,现在小C要用张导游的魔棒,使得从入口到出口的距离最短。现在我们也来编一个程序:求将哪一条边减半后使从顶点1到顶点N的最短路径长度最短,输出这个最短距离,如果找不到从1到N的路径,则输出 -1 。

数据输入:

从文件中c.in读入数据,文件第一行是一个正整数N(3 ≤ N ≤ 50),表示共有N个点,接下来是一个N行N列的数据阵,a[I,j]的值表示顶点i到顶点j的长度。

数据输出:

只有一个数就是将一条边长减半后的从1到N的最短路径长度,结果四舍五入到小数后两位,如果找不到从1到N的路径,则输出 -1 。

输入输出样例

c.in

3

0 5 20

5 0 8

20 8 0

c.out

9.00

思路:

map[1,i,j]放i到j的不减半的最短路径

map[0,i,j]放i到j的减半的最短路径

跑Floyd求最短路

var
map:array[0..1,0..51,0..51] of double;
i,j,n,s,t,l,k:longint;
function min(a,b:double):double;
begin
if a<b then exit(a);
exit(b);
end;

begin
read(n);
for i:=1 to n do
for j:=1 to n do
begin
read(s);
if s<>0 then
begin
map[1,i,j]:=s;//建立不减半的路径表
map[0,i,j]:=s/2;//建立减半的路径表
end
else
begin
map[1,i,j]:=2333333;
map[0,i,j]:=2333333;
end;
end;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
begin
if (k<>i)and(k<>j)and(i<>j) then
begin
map[1,i,j]:=min(map[1,i,j],map[1,j,k]+map[1,k,i]);//i到j的不减半的最短路
map[0,i,j]:=min(map[0,i,j],map[0,j,k]+map[1,k,i]);//i到j的减半的最短路
map[0,i,j]:=min(map[0,i,j],map[1,j,k]+map[0,k,i]);//i到j的减半的最短路
end;
end;
if map[0,1,n]<>2333333 then write(map[0,1,n]:0:2)
else write('-1');
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: