C++之最短路径算法(无权最短路径)

7 篇文章 0 订阅

 无权的最短路径的算法与广度优先搜索算法的实质是一样的。层层递推(每次路径值加一),层层被赋值,就像树的层序遍历。

 

#include<iostream>
#include<queue>
#include<list>
#include<memory>
#include<vector>
const size_t InFinity = 999;
struct Vertex {
	size_t   vertexnumber;
	bool*    visited;  //对访问过的vertex进行标记
	size_t*  dis;      //startvertex 到 每一个vertex的路径值
};
class Graph {
public:
	Graph(const size_t _vertexnumber) :verptr(std::make_unique<Vertex>()), lists(new std::list<size_t>[_vertexnumber]()), queu(new std::queue<size_t>[_vertexnumber]()) {
		verptr->visited = new bool[_vertexnumber]();
		verptr->dis = new size_t[_vertexnumber]();
		verptr->vertexnumber = _vertexnumber;
		for (int i = 0; i < verptr->vertexnumber; ++i)
			verptr->dis[i] = InFinity;
	}
	~Graph() {
		if (verptr->dis && verptr->visited && queu && lists) {
			delete[] verptr->dis;
			delete[] verptr->visited;
			delete[] queu;
			delete[] lists;
		}
		else
			throw std::out_of_range("Out of MemorySpace!!");
	}

	void AddEdge(const size_t v, const size_t w);
	void UnWeight(size_t v);

private:
	std::unique_ptr<Vertex>verptr;
	std::list<size_t>*lists;
	std::queue<size_t>*queu;
};

void Graph::AddEdge(const size_t v, const size_t w) {
	lists[v].push_back(w);
}

void Graph::UnWeight(size_t v) {
	auto v_ = v;
	verptr->dis[v] = 0;
	queu->push(v);
	while (!queu->empty()) {
		v = queu->front();
		queu->pop();
		auto beg = lists[v].begin();
		while (beg != lists[v].end()) {
			verptr->visited[v] = true; 
			if (verptr->dis[*beg]==InFinity) {
				verptr->dis[*beg] = verptr->dis[v] + 1;
				queu->push(*beg);
			}
			++beg;
		}
	}
	for (int i = 0; i < verptr->vertexnumber; ++i) {
		std::cout << v_ << " to " << i << "  MinPath:  " << verptr->dis[i] << std::endl;
	}
}

int main(void)
{
	const size_t vertexnumber = 7;
	Graph graph(vertexnumber);
	graph.AddEdge(0, 1);
	graph.AddEdge(0, 2);
	graph.AddEdge(0, 3);
	graph.AddEdge(1, 3);
	graph.AddEdge(1, 4);
	graph.AddEdge(2, 5);
	graph.AddEdge(3, 2);
	graph.AddEdge(3, 5);
	graph.AddEdge(3, 6);
	graph.AddEdge(3, 4);
	graph.AddEdge(4, 6);
	graph.AddEdge(6, 5);
	graph.UnWeight(0);

	system("pause");
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值