算法设计与分析 头哥educoder 旅行商问题

设有n个城市组成的交通图,一个售货员从住地城市q出发,到其它城市各一次去推销货物,最后回到住地城市。 要求:假定两个城市a,b 从a到b的路程花费w_ab是已知的,问应该怎样选择一条花费最少的路线?

输入格式: 第一行n m q,n和m两个整数分别表示城市数n以及城市之间的单向路数量m,q表示住地城市(出发城市) 之后m行 a b w分别表示从城市a到城市b的单向路程的花费w_ab。 输出格式: 第一行输出最小花费是D,D表示计算得到的最小花费。 第二行输出最小花费共有N种方案,分别是:,N表示最小花费方案的种类, 接下来N行输出每种方案的前往顺序,以字典序排序输出,中间以空格分隔。

输入样例: 3 6 A A B 12 A C 4 B C 5 B A 8 C B 7 C A 2

输出样例: 最小花费是19 最小花费共有2种方案,分别是: A B C A C B

from itertools import permutations


def tsp(n, m, q, roads):
    from sys import maxsize
    cities = set()
    city_indices = {}
    index_cities = {}

    # 建立城市与索引的映射关系
    for i, road in enumerate(roads):
        cities.add(road[0])
        cities.add(road[1])
    cities = sorte
  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值