Dijkstra算法

定义

  • 求解单元路径问题

邻接矩阵 O(V2)

#include<stdio.h>
#include<algorithm>
using namespace std;
//Dijkstra算法
//邻接矩阵
const int max_n = 30;
const int INF = 0x3ffffffff;
int n,G[max_n][max_n];
int vis[max_n] = { false };
int d[max_n];//i s之间的最短距离
void Dijkstra(int s)
{
	//
	fill(d, d + max_n, INF);
	d[s] = 0;
	for (int j = 0; j < n; j++)
	{
		int u = -1, min = INF;
		//找到未访问过的距离s最小的点
		for (int i = 0; i < n; i++)
		{
			if (vis[i] == false && d[u] < min)
			{
				min = d[u];
				u = i;
			}
		}
		if (u == -1)return;
		vis[u] = true;
		//更新
		for (int i = 0; i < n; i++)
		{
			if (G[u][i] != INF && d[i] > d[u] + G[u][i] && vis[i] == false)
			{
				d[i] = d[u] + G[u][i];
			}
		}
	}
	
}

邻接表 O(V2+E)

#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
//Dijkstra算法
//邻接表
const int max_n = 30;
const int INF = 0x3ffffffff;
struct node {
	int index;
	int w;
};
struct adj {
	vector<node>nodes;
}Adj[max_n];
int vis[max_n] = { false };
int d[max_n];//i s之间的最短距离
int n;
void Dijkstra(int s)
{
	fill(d, d + max_n, INF);
	d[s] = 0;
	for (int j = 0; j < n; j++)
	{
		int u = -1, min = INF;
		for (int i = 0; i < n; i++)
		{
			if (vis[i] == false && d[i] < min)
			{
				min = d[i];
				u = i;
			}
		}
		if (u == -1)return;
		vis[u] = true;
		//更新
		for (int i = 0; i < Adj[u].nodes.size(); i++)
		{
			if (vis[Adj[u].nodes[i].index] == false &&
				d[Adj[u].nodes[i].index] > d[Adj[u].nodes[i].index] + Adj[u].nodes[i].w)
			{
				d[Adj[u].nodes[i].index] = d[Adj[u].nodes[i].index] + Adj[u].nodes[i].w;
			}
		}
	}
	
	
}

Dijkstra算法+DFS

Dijkstra用来求最短路径,用pre保存最短路径。DFS可以根据pre来求解一下权值。

posted @ 2021-09-06 15:01  小帆敲代码  阅读(29)  评论(0编辑  收藏  举报