单向系统的最短路径


9

我的家乡Rhyl拥有一个单向交通系统,该系统的设计旨在使人们尽可能长时间地远离目的地。您的任务(应该选择尝试)是生成一个程序,以给出通过此类交通系统的最短路线。

输入项

输入将是on STDIN,并且将是一个起点和终点列表,后跟一个空行,然后是一个查询列表,如下所示:

A B
B A
B C
C D
D C

A D
C A
B A

每条道路只能沿给定的方向行进,因此,在上述示例中,道路A-B是双向道路,而B-C是从B到C的单向道路。从C到B被禁止。

起点和终点都将由一个大写字母表示。

输出量

对于收到的每个查询,输出应该是从给定起点到给定终点的最短路径(由访问的点数衡量)。如果没有这样的路由,则输出空白行。如果存在多个最短路径,则按字典顺序对所有最短路径进行排序时,输出第一个。

对于上面的示例,输出为:

A B C D

B A

测试脚本

和以前一样,我将基于JoeyVentero编写的脚本为此任务提供测试:

并对无法使用上述脚本的任何人进行测试和预期输出

用法: ./test [your program and its arguments]

奖赏

很显然,所有尝试打高尔夫球的答案都符合规格要求,并且通过了所有测试,这些答案都将使我感到欣慰。到2012年1月26日的最短工作答案将被接受。


output the first when sorting all shortest routes lexicographically-因此,如果A B DA C D都是有效的解决方案,请A B D改为输出?
拉玛先生先生2012年

@GigaWatt是的,是的。
Gareth 2012年


1
@PeterTaylor为什么在问题沙盒中不提出该问题?你有什么建议?我可以删除它,而没有答案,我想吗?
Gareth 2012年

@Gareth,因为这一次使meta上的几个线程同时处于活动状态,而且我没有注意到问题沙箱中有新的答复。删除是一种可能。或者您可以扩展它以增加边缘的权重-我们还没有直接的Dijkstra问题。
彼得·泰勒

Answers:


3

Haskell,223207个字符

main=interact$unlines.f.break null.map words.lines
s%[f,t]=[[f]]#t where[]#_="";x#t|y@(_:_)<-[z|z<-x,last z==t]=unwords$minimum y|1<3=s&x#t
s&z=[x++[b]|x<-z,[a,b]<-s,last x==a,notElem b x];f(s,_:q)=map(s%)q

2

蟒(2.X),382个 369 358 338 323 318字符

欢迎所有提示和评论!

import os;u=str.split;l=u(os.read(0,1e9),'\n')
p,g,c=l.index(''),{},map;o=g.setdefault
def f(g,s,e,q=[]):q=q+[s];y=([],[q])[s==e];[c(y.append,f(g,n,e,q))for n in set(o(s,[]))-set(q)];return y
for k,v in c(u,l[:p]):o(k,[]);g[k]+=v
for w,e in c(u,l[p+1:]):h=sorted(f(g,w,e));print''if not h else' '.join(min(h,key=len))

应该以这种形式通过测试。通过标准输入输入,例如python shortestroute.py < test.txt


似乎未能通过测试4的查询2。返回A B I J M而不是A B G J M
Gareth 2012年

@Gareth:考虑到字典上类似长度的解决方案,确实存在一个小错误,现在应该修复...
ChristopheD

1

C:450437404,390个字符

#include<stdio.h>
#include <string.h>
r[99][99],p[99],q[99],m[99],i,j,x,y,s;
char t[9],e[9999];
F(k)
{
    m[k]^s?r[p[k]=q[i]][k]?m[q[j++]=k]=s:0:0;
    if(++k<99)F(k);
}
f()
{
    F(0);
    if(++i^j)f();
}
P(o)
{
    if(p[o])P(p[o]);
    *t=m[o]^s?0:o;
    strcat(e,t);
}
w()
{
    gets(t);
    r[*t][t[2]]=*t?w():0;
}
W()
{
    gets(t);
    x=*t,x?y=t[j=2],s=x+y*99,m[q[t[2]=i=p[x]=0]=x]=s,f(),P(y),strcat(e,"\n"),W():0; 
}
main()
{
    w();
    W();
    puts(e);
}

puts("\n")打印两个换行符。 puts()自动在其打印的字符串中添加行尾终止符。为避免该行为,请使用fputs(str, stdout)或简单地printf(str)
JB 2012年

略微弯曲规则-应该一次性输入所有输入,然后一次性输出所有查询答案。我会对其进行+1,因为它可以很好地工作(并在测试中发现了错误),但是我将无法在完全符合输入/输出要求的更长程序中接受它。
Gareth 2012年

@加雷斯:固定。但是,答案输出不能超过9999个字符!
Ali1S232 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.