用分支定界算法求以下问题:
某公司于乙城市的销售点急需一批成品, 该公司成品生产基地在甲城市。甲城市与乙城市之间共有 n 座城市,互相以公路连通。甲城市、乙城市以及其它各城市之间的公路连通情况及每段公路的长度由矩阵M1 给出。每段公路均由地方政府收取不同额度的养路费等费用, 具体数额由矩阵 M2 给出。请给出在需付养路费总额不超过 1500 的情况下,该公司货车运送其
产品从甲城市到乙城市的最短运送路线。
具体数据参见文件:
M1.txt: 各城市之间的公路连通情况及每段公路的长度矩阵(有向图); 甲城市为城市 Num.1,乙城市为城市 Num.50。(9999表示不连通)
M2.txt: 每段公路收取的费用矩阵(非对称)。
解题思路:
利用Length_bound[i]和Cost_bound[i]记录搜索过程中到该城市路线总长度和总花费都最小的
界,再搜索到该城市时,如果其长度和花费均大于bound,则剪枝,如果长度和花费均小于bound,
则更新bound(该bound主要为了避免陷入自环)
利用Dijkstra算法分别找出从终点城市出发到所有其他城市的最短路径长度Min_Length[i]以
及最小花费Min_Cost[i],并以此也作为bound。
再从起点城市出发,利用DFS进行路径搜索,每前进一个城市,判断已走路径长度与当前城市
到终点的最短路径之和Sum_Length + Min_Length[i]是否大于已经搜索到的当前最优路线的路径
长度Best_Length,若大于则无需向下搜索,否则再比较已走路径花费与前城市到终点的最小花费
之和Sum_Cost + Min_Cost[i]是否大于1500,若大于则无需向下搜索。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <fstream>
#include <sstream>
#include <vector>
#include <queue>
#include <time.h>
#define City_Num 50 //城市的数量
#define N_MAX (City_Num + 1) //定义邻接矩阵的大小为城市数量+1
#define INF (