分支限界法求解旅行商问题

这篇博客介绍了如何运用分支限界法来解决2016年华为软件精英挑战赛中的一种特殊旅行商问题。问题涉及到带有权重的有向图,寻找从特定起点s到终点t的不成环路径,路径需经过指定的顶点集合V'。文章强调了图的特性、路径要求以及权重计算,并指出与经典旅行商问题的区别。作者使用C++实现了初步的分支限界算法,以求近似解,并在后续对代码进行了优化,以节省内存。
摘要由CSDN通过智能技术生成

问题来来自2016华为软件精英挑战赛。

 问题定义

给定一个带权重的有向图G=(V,E),V为顶点集,E为有向边集,每一条有向边均有一个权重。对于给定的顶点s、t,以及V的子集V',寻找从s到t的不成环有向路径P,使得P经过V'中所有的顶点(对经过V'中节点的顺序不做要求)。

若不存在这样的有向路径P,则输出无解,程序运行时间越短,则视为结果越优;若存在这样的有向路径P,则输出所得到的路径,路径的权重越小,则视为结果越优,在输出路径权重一样的前提下,程序运行时间越短,则视为结果越优。

说明:

1)图中所有权重均为[1,20]内的整数;

2)任一有向边的起点不等于终点;

3)连接顶点A至顶点B的有向边可能超过一条,其权重可能一样,也可能不一样;

4)该有向图的顶点不会超过600个,每个顶点出度(以该点为起点的有向边的数量)不超过8;

5)V'中元素个数不超过50;

6)从s到t的不成环有向路径P是指,P为由一系列有向边组成的从s至t的有向连通路径,且不允许重复经过任一节点;

7)路径的权重是指所有组成该路径的所有有向边的权重之和。


与经典旅行商问题相比,有几点小区别:

①是有向图

②起点终点是不同的点

③大图中的指定点集,难度更大


由于大赛对程序运行时间有限制,所以需要一个求近似解的算法。


但还是现用分支限界试试,用C++做了初步的实现,暂做记录。


3月7日下午两点半修改了代码,改用链表维护path,节省内存


#pragma once
#include <iostream>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <vector>
#include <stack>
using namespace std;

struct Node {
	int id;
	Node* path_father;	//路径中父节点
	int already;		//path中V'中节点数目(默认source和destination不在V'中)
	int path_cost;
	Node(int i) : id(i), path_cost(0), already(0), path_father(NULL) {};
	Node(int i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值