#include
#include
#include
#include
#define MAX_CITIES 15 /* 城市的数目 */
#define INFINITY 9999 /* 表示无穷大 */
#define I INFINITY /* 表示无穷大 */
typedef struct _POINT { /* 定义点的结构 */
int x;
int y;
} POINT;
typedef struct _EDGE { /* 定义边的结构 */
int head;
int tail;
} EDGE;
typedef struct _PATH { /* 定义路径结构 */
EDGE edge[MAX_CITIES];
int edgesNumber;
} PATH;
typedef struct _MATRIX { /* 定义花费矩阵结构 */
int distance[MAX_CITIES][MAX_CITIES];
int citiesNumber;
} MATRIX;
typedef struct _NODE { /* 定义树结点 */
int bound; /* 结点的花费下界 */
MATRIX matrix; /* 当前花费矩阵 */
PATH path; /* 已经选定的边 */
} NODE;
int minDist = INFINITY;
int GraphDriver;
int GraphMode;
int ErrorCode;
POINT city[MAX_CITIES] = {
{459, 333}, {345, 234}, {362, 245}, {332, 183},
{323, 343}, {630, 345}, {154, 263}, {213, 112},
{432, 254}, {534, 223}, {334, 333}, {432, 234},
{ 23, 442}, {600, 400}, {500, 300}
};
int Simplify(MATRIX *); /* 归约矩阵并返回归约常数 */
int MatrixSize(MATRIX, PATH); /* 计算矩阵阶数 */
EDGE SelectBestEdge(MATRIX); /* 返回最合适的分枝边 */
MATRIX InitMatrix(void); /* 初始化费用矩阵数据 */
MATRIX LeftNode(MATRIX, EDGE); /* 计算左枝结点费用矩阵 */
MATRIX RightNode(MATRIX, EDGE, PATH); /* 计算右枝结点费用矩阵 */
PATH AddEdge(EDGE, PATH); /* 将边添加到路径数组中 */
PATH BABA(NODE *); /* 分枝回溯函数 B-and-B Ar. */
PATH MendPath(PATH, MATRIX); /* 修补没有完成的路径 */
void ShowMatrix(MATRIX); /* 文本显示费用矩阵 调试用 */
void ShowPath(PATH); /* 文本显示路径 */
void DrawPath(PATH); /* 图形显示路径 */