算法改进:通过改进集合操作降低比较次数,利用二进制表示集合。确定元素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)