贪心算法——2.5最短路径(Dijkstra)_算法学习

 

贪心算法——2.5最短路径(Dijkstra)_算法与数据结构_02

图解如下:

贪心算法——2.5最短路径(Dijkstra)_趣学算法学习笔记_03

 

贪心算法——2.5最短路径(Dijkstra)_算法与数据结构_04

 

贪心算法——2.5最短路径(Dijkstra)_算法学习_05

贪心算法——2.5最短路径(Dijkstra)_趣学算法学习笔记_06

 

贪心算法——2.5最短路径(Dijkstra)_趣学算法学习笔记_07

代码实现如下:

#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100;
const int INF = 1e7;
int map[N][N], dist[N], n, m;
int flag[N];
struct Node
{
	int u, step;
	Node() {};
	Node(int a, int sp)
	{
		u = a;
		step = sp;
	}
	bool operator <(const Node &a)const
	{
		return step > a.step;
	}
};
void Dijkstra(int st)
{
	priority_queue<Node> Q;
	Q.push(Node(st,0));
	memset(flag, 0, sizeof(flag));
	for (int i = 0; i < n; i++)
		dist[i] = INF;
	dist[st] = 0;
	while (!Q.empty())
	{
		Node it = Q.top();
		Q.pop();
		int t = it.u;
		if (flag[t])
			continue;
		flag[t] = 1;
		for (int i = 0; i < n; i++)
		{
			if (!flag[i] && map[t][i] < INF)
			{
				if (dist[i] > dist[t] + map[t][i])
				{
					dist[i] = dist[t] + map[t][i];
					Q.push(Node(i, dist[i]));
				}
			}
		}
	}
}
int main()
{
	int u, v, w, st;
	cout << "请输入城市个数和路线个数"<<endl;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			map[i][j] = INF;
	cout << "请输入城市之间u,v的路线以及其距离w" << endl;
	while (m--)
	{
		cin >> u >> v >> w;
		map[u][v] = min(map[u][v], w);
	}
	cout << "请输入小明的位置:" << endl;
	cin >> st;
	Dijkstra(st);
	for (int i = 0; i < n; i++)
	{
		cout << "要去的位置:" << i;
		if (dist[i] == INF)
			cout << "无法到达" << endl;
		else
			cout << "最短距离:" << dist[i] << endl;
	}
	return 0;
}