std::vector实现邻接链表

std::vector实现邻接链表

首先定义一个结构体,包括邻接结点和边权值,用来表示一条边:

struct Edge { 
	int nextNode;//下一个结点编号 
	int cost;//该边的权重 
}; 

为每一个结点都建立一个单链表来保存与其相邻的边权值和结点的信息。使用vector来模拟这些单链表,利用如下语句为每一个结点都建立一个 vector对象(结点数量为N)。

vector<Edge> edge[N]; 

该语句建立了一个大小为N的数组,而数组中保存的元素即为Edge对象, 我们用edge[i]的vector来表示结点i建立的单链表。
为了使用vector还需在C++源文件头部添加相应的头文件。

#include <vector> 
using namespace std; //声明使用标准命名空间 

为这些“单链表”添加和删除信息:

for (int i = 0;i < N;i ++) {
	 //遍历所有结点   
	 edge[i].clear(); //清空其单链表 
 } 

对这些单链表进行初始化,即利用vector::clear()操作清空这些单链表。向其中添加信息时,调用vector::push_back(Edge)。如下所示:

Edge tmp; //准备一个Edge结构体  
tmp.nextNode = 3; //下一结点编号为3 
tmp.cost = 38; //该边权值为38 
edge[1].push_back(tmp); //将该边加入结点1的单链表中 

查询某个结点的所有邻接信息时,则对vector进行遍历:

for (int i = 0;i < edge[2].size();i ++) { 
	//对edge[2]进行遍历,
std::vector<int> twoOpt(const std::vector<CDot>& points, const std::vector<CDot>& pointsEnd, std::vector<int> path) { CString str; bool improved = true; double bestDistance = 0; for (size_t i = 0; i < path.size() - 1; ++i) { bestDistance += calculateDistance(pointsEnd[path[i]], points[path[i + 1]]); } DWORD t1, t2,t3,t4; while (improved) { improved = false; for (size_t i = 0; i < path.size() - 1; ++i) { t3 = timeGetTime(); for (size_t k = i + 1; k < path.size(); ++k) { std::vector<int> newPath = path; twoOptSwap(newPath, i, k); double newDistance = 0; for (size_t j = 0; j < newPath.size() - 1; ++j) { newDistance += calculateDistance(pointsEnd[newPath[j]], points[newPath[j + 1]]); } if (newDistance < bestDistance) { path = newPath; bestDistance = newDistance; improved = true; break; // 提前终止内层循环 } } t4= timeGetTime() - t3; str.Format("i=%d,耗时:%d,bestDistance:%0.3f\n", i, t4, bestDistance ); OutputDebugString(str); } } return path; } void twoOptSwap(std::vector<int>& path, int i, int k) { if (i < k) { std::reverse(path.begin() + i, path.begin() + k + 1); } } double calculateDistance(const CDot& p1, const CDot& p2) { return std::sqrt(std::pow(p2.x - p1.x, 2) + std::pow(p2.y - p1.y, 2)); } std::vector<int> tspGreedy(const std::vector<CDot>& points,const std::vector<CDot>& pointsEnd,bool bSort,int nStartIndex) { int nStart=nStartIndex; std::vector<int> path; int nSize=points.size(); double dbMinDis=9999999999; std::vector<int> pathMin; for (int k=0;k<nSize;k++) { if (bSort) nStart=k; path.clear(); path.push_back(nStart); // 添加起始点 std::vector<bool> visited(points.size(), false); // 记录每个点是否已访问 visited[nStart] = true; // 起始点已访问 double dbDis=0; int currentIndex = nStart; // 当前所在点的索引 while (path.size() < points.size()) { // 未访问的点仍存在 double minDistance = 999999999;//std::numeric_limits<double>::max(); int nearestPoint = -1; for (int i = 0;
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值