最短路径问题

本文详细介绍了Dijkstra算法在处理只包含正路径的最短路径问题时的实现过程,包括伪代码解释、实际代码演示及复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最短路径问题可以根据路径长度分为两种,一种是有负路径存在,一种是只有正路径。


对于只有正路径的情况,最经典的是dijkstra算法。

// dijkstra算法 伪代码

init_source_map(int d[], int nV);

push_all_V_into_queqe(pqueue<int>q, int nV);

for(int i=0; i<nV; i++){

    V = extract_min(q, d); //q.remove(V);

    relax_all(V);//(u, v, w(u, v))

}

复杂度分析:O(V*(V+V)) = O(V^2)。


实际代码:



#include<queue>
#include<stack>

using namespace std;

struct SE{
	int vIndex;
	int tag;
	int edge;
	SE* next;
};

struct SMap{
	SE* pE;
	int nnode;
};

void visit(SE *se){
	printf("%d\n", se->vIndex);
}

SMap* create_map(int matrix[][6], int n){
	SMap* pMap = new SMap();
	pMap->nnode = n;
	pMap->pE = new SE[n];
	memset(pMap->pE, 0, n*sizeof(SE));
	for (int i = 0; i<n; i++){
		pMap->pE[i].vIndex = i;
		pMap->pE[i].tag = 0;
		SE* p = &pMap->pE[i];
		for (int j = 0; j<n; j++){
			if (matrix[i][j] != 0){
				p->next = new SE();
				p->next->vIndex = j;
				p->next->edge = matrix[i][j];
				p->next->tag = 0;
				p->next->next = NULL;
				p = p->next;
			}
		}
	}
	return pMap;
}

int init_source_map(int d[], int nV){
	for (int i = 0; i<nV; i++){
		d[i] = INT_MAX;
	}
	d[0] = 0;
	return 0;
}

int push_all_V_into_queqe(pair<int, int> q[], int* d, int nV){
	for (int i = 0; i<nV; i++){
		q[i].first = 0;
		q[i].second = d[i];
	}
	return 0;
}

int extract_min(pair<int, int>q[], int* d, int nV){
	int mind = INT_MAX;
	int mini = 0;
	for (int i = 0; i<nV; i++){
		if (d[i]<mind && q[i].first == 0){
			mind = d[i];
			mini = i;
		}
	}
	q[mini].first = 1;
	return mini;
}

int relax_all(SE* pE, pair<int, int>q[], int d[], int V){

	SE* p = pE;
	int v = pE->vIndex;
	while (p->next){
		p = p->next;
		int u = p->vIndex;
		int w = p->edge;
		if (d[u] > d[v] + w){
			d[u] = d[v] + w;
			q[u].second = d[u];
		}
	}
	return 0;
}

int dijkstra(SMap* pmap){
	const int nV = 6;
	int d[nV] = { 0 };
	init_source_map(d, nV);
	pair<int, int>q[nV];
	push_all_V_into_queqe(q, d, nV);
	for (int i = 0; i<nV; i++){
		int V = extract_min(q, d, nV); // with q.remove(V);
		relax_all(&pmap->pE[V], q, d, V);
	}
	return 0;
}




int main(){
	int map[6][6] = {
		{ 0, 1, 0, 1, 0, 0 },
		{ 1, 0, 1, 1, 1, 0 },
		{ 0, 1, 0, 1, 0, 0 },
		{ 1, 1, 1, 0, 1, 0 },
		{ 0, 1, 0, 1, 0, 1 },
		{ 0, 0, 0, 0, 1, 0 }
	};

	SMap* smap = create_map(map, 6);
	dijkstra(smap);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值