1、在实现过程中,使用一个最小优先队列来记录活节点,队列中每个节点的类型为MinHeapNode。每个节点包括如下区域: x(从1到n的整数排列,其中x0 = 1 ),s(一个整数,使得从排列树的根节点到当前节点的路径定义了旅行路径的前缀x0:s, 而剩余待访问的节点是x s + 1 : n - 1 ),cc(旅行路径前缀,即解空间树中从根节点到当前节点的耗费),lcost(该节点子树中任意叶节点中的最小耗费), rcost(从顶点xs : n - 1出发的所有边的最小耗费之和)。当类型为MinHeapNode( T )的数据被转换成为类型T时,其结果即为lcost的值。代码:#include i
2、stream using namespace std;/-宏定义- #define MAX_CITY_NUMBER 10 /城市最大数目 #define MAX_COST 10000000 /两个城市之间费用的最大值 /-全局变量- int City_GraphMAX_CITY_NUMBERMAX_CITY_NUMBER; /表示城市间边权重的数组 int City_Size; /表示实际输入的城市数目 int Best_Cost; /最小费用 int Best_Cost_PathMAX_CITY_NUMBER; /最小费用时的路径 /-定义结点- typedef struct Node in
3、t lcost; /优先级 int cc; /当前费用 int rcost; /剩余所有结点的最小出边费用的和 int s; /当前结点的深度,也就是它在解数组中的索引位置 int xMAX_CITY_NUMBER; /当前结点对应的路径 struct Node* pNext; /指向下一个结点 Node;/-定义堆和相关对操作- typedef struct MiniHeap Node* pHead; /堆的头 MiniHeap;/初始化 void InitMiniHeap(MiniHeap* pMiniHeap) pMiniHeap-pHead = new Node;pHead-pNext
4、 = NULL; /入堆 void put(MiniHeap* pMiniHeap,Node node) Node* next; Node* pre; Node* pinnode = new Node; /将传进来的结点信息copy一份保存 /这样在函数外部对node的修改就不会影响到堆了 pinnode-cc = node.cc;lcost = node.lcost;pNext = node.pNext;rcost = node.rcost;s = node.s; for(int k=0;kxk = node.xk; pre = pMiniHeap-pHead; next = pMiniHe
5、ap-pNext; if(next = NULL) pMiniHeap-pNext = pinnode; else while(next != NULL) if(next-lcost) (pinnode-lcost) /发现一个优先级大的,则置于其前面 pinnode-pNext = pre- pre- break; /跳出 pre = next; next = next- pre- /放在末尾 /出堆 Node* RemoveMiniHeap(MiniHeap* pMiniHeap) Node* pnode = NULL; if(pMiniHeap-pNext ! pnode = pMini
6、Heap-pNext = pMiniHeap-pNext- return pnode;/-分支限界法找最优解- void Traveler() int i,j; int temp_xMAX_CITY_NUMBER; Node* pNode = NULL; int miniSum; /所有结点最小出边的费用和 int miniOutMAX_CITY_NUMBER; /保存每个结点的最小出边的索引 MiniHeap* heap = new MiniHeap; /分配堆 InitMiniHeap(heap); /初始化堆 miniSum = 0; for (i=0;ii+) miniOuti = M
7、AX_COST; /初始化时每一个结点都不可达 for(j=0;j0 & City_Graphijlcost = 0; /当前结点的优先权为0 也就是最优 cc = 0; /当前费用为0(还没有开始旅行) rcost = miniSum; /剩余所有结点的最小出边费用和就是初始化的miniSum s = 0; /层次为0 pNode-xk = Best_Cost_Pathk; /第一个结点所保存的路径也就是初始化的路径 put(heap,*pNode); /入堆 while(pNode != NULL & (pNode-s) City_Size-1) /堆不空 不是叶子 for(int k=0; Best_Cost_Path
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1