c语言旅行规划问题,利用动态规划法求解旅行商问题(TSP)的C语言实现(一)...

本文介绍了一种使用动态规划解决旅行商问题的C语言实现方法。通过改进集合操作,利用二进制表示集合,可以降低比较次数,从而减少时间复杂度。文章详细展示了代码实现,包括集合操作函数、递归打印路径和计算最短路径的函数。
摘要由CSDN通过智能技术生成

算法改进:通过改进集合操作降低比较次数,利用二进制表示集合。确定元素k是否在集合S中的比较次数为1,从而降低了时间复杂度到O(n2^n)

#include

#include

#include

#include

#include

#define MAX_N 10

int mypow(int x, int y)

{

return (int)pow((double)x,(double)y);

}

struct path

{

int current;

int cost;

long set;//2 bits for vector

//struct path *lastNode;

struct path *lastNode;

struct path *next;

};

struct path *D[MAX_N];

/*下面三个函数是集合中子集的相关操作,集合利用2进制代码来表示

*比如包含n个元素的集合,将这n个元素从1到n标记,利用二进制中的相对应的位表示。

*如果第k位是1代表,元素k包含在这个子集中,如果为0表示不在这个子集中。

*/

/*功能是判断元素i是否在子集set中。

*采用按位与的方法,判断是否在set中

*返回1表示存在,返回0表示不存在

*/

int inSet(int i, int set)

{

if((mypow(2,i-1)&set)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值