[算法]数据结构中关于货郎担路径问题的常用解法,边界路径问题

本文介绍了数据结构中的货郎担问题及其四种解法,重点讲解使用动态规划结合边界路径问题的算法。通过C语言实现,动态规划代码在TC平台上调试通过。该算法用于解决经典图算法问题,探讨了回溯、贪心和动态规划等方法。
摘要由CSDN通过智能技术生成
[算法]数据结构中关于货郎担路径问题的常用解法,边界路径问题相信诸位学习过高级算法数据结构的朋友肯定是知道“货郎担问题”是很经典的图算法问题货郎担问题可以总结出4种不同的解法,主要有回溯、贪心、动态规划以下提供的算法是使用的动态规划方法,结合边界路径问题提出的算法C语言实现,调试TC平台,动规算法



代码:





/* 货郎担路径问题 边界路径,贪心算法

* author YCTC CG

* code 12 10

* last modify 12 13

*/

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define MAX_CITIES 10

#define INFINITY 9999

#define I INFINITY



typedef int bool;

/* 定义边结构 */

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; /* 已经选定的边 */

struct _NODE* left; /* 左枝 */

struct _NODE* right; /* 右枝 */

} NODE;

/*stack called*/

int Simplify(MATRIX*);

EDGE SelectBestEdge(MATRIX);

MATRIX LeftNode(MATRIX, EDGE);

MATRIX RightNode(MATRIX, EDGE, PATH);

PATH AddEdge(EDGE, PATH);

PATH BABA(NODE);

PATH MendPath(PATH, MATRIX);

int MatrixSize(MATRIX, PATH);

void ShowMatrix(MATRIX);

void ShowPath(PATH, MATRIX);

main(){

PATH path;

NODE root = {

0, /* 花费下界 */

{ { {I, 1, 2, 7, 5}, /* 自定义花费矩阵 */

{1, I, 4, 4, 3},

{2, 4, I, 1, 2},

{7, 4, 1, I, 3},

{5, 3, 2, 3, I}}, 5}, /* 城市数目 */

{ {0}, 0}, /* 经历过的路径 */

NULL, NULL /* 左枝与右枝 */

}; /*root*/

/* 归约,建立根结点 */

clrscr();

root.bound += Simplify(&root.matrix);

/* 进入搜索循环 */

path = BABA(root);

ShowPath(path, root.matrix);

return 0;

}/*main*/

/*

* 算法主搜索函数,Branch-And-Bound Algorithm Search

* 输入:root 是当前的根结点

*/

PATH BABA(NODE root){

int i;

static int minDist = INFINITY;

static PATH minPath;

EDGE selectedEdge;

NODE *left, *right;

puts("Current Root:n------------");

ShowMatrix(root.matrix);

printf("Root Bound
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值