星期天小明来到动物园游玩,园内共有n 个景点,每个景点序号为0,1,2,3……至n-1。现在只知道每个景点有一条路连接下一个景点。小明想寻找能游玩景点个数最多的一种方案并且从其中一个景点出发,最后能够回到出发景点。如果游玩的景点个数一样,则优先考虑景点序号小的。
例如,共有n=5 个景点,每个景点连接的下个景点分别是1,3,4,4,1
景点号 | 0 | 1 | 2 | 3 | 4 |
下一个景点号 | 1 | 3 | 4 | 4 | 1 |
方案一:从0号景点出发,则游玩线路为:0号→1号→3号→4号→1号,由于此方案无法回到出发点,则不考虑;
方案二:从1号景点出发,则游玩线路为:1号→3号→4号→1号,然后回到1号景点。最多可以玩3个景点。
现用Python程序模拟这个问题:
先输入景点总数:n ;则对应的景点为[0,1,2,3,4]
然后随机产生各景点所连接的下一个景点的序号,如:[1,3,4,4,1];
接着产生一个列表,如上表的信息则产生的列表s为:[[0,1],[1,3],[2,4],[3,4],[4,1]],
最后利用链表的方式来分析解决问题。
程序如下:
import random
#产生信息列表s
n=int(input("景点总数 "))
tt=[ ]; s=[ ]; c=0
while c < n :
t=random.randint(0,n-1)
if t !=c :
s.append([ ① ])
c+=1
print(s)
#枚举所有方案,寻找正确方案。
max=0
for head in range(n):
p=head
k=1
while k<=n and s[p][1]!=head:
k+=1
p=s[p][1]
if :
max = k
maxp = head
print("小明最多能访问 %d 个景点"%(max))
#输出正确线路
p=maxp
while s[p][1]!=maxp:
print(s[p][0],end="→")
p=s[p][1]
print( ② )