最短路径——Dijkstra算法

Dijkstra算法

求某一个到任意点的最短路径

Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。

最短路径——Dijkstra算法_第1张图片

邻接矩阵:

0 1 2 3 4 5 6
0 0 4 6 6 INF INF INF
1 INF 0 1 INF 7 INF INF
2 INF INF 0 INF 6 4 INF
3 INF INF 2 0 INF 5 INF
4 INF INF INF INF 0 INF 6
5 INF INF INF INF 1 0 8
6 INF INF INF INF INF INF 0

C++代码实现:

#include 
using namespace std;

///全局变量区域
const int MAX = 32767;
const int maxn = 15;
int dist[maxn];//保存i->j的当前最短路径长度
int path[maxn];//只保存i->j当前最短路径中的前一个顶点的编号
bool visited[maxn];
int v[maxn][maxn];
int n; //实际结点数
///

void Dijkstra(int node)
{
     
	memset(visited,0,sizeof(visited)); 	//全部赋值为false  全部未访问
	for(int i=0;i<n;i++)				//初始化dist数组和path数组
	{
     
		dist[i] = v[node][i];
		path[i] = node;
	}
	visited[node] = true;				//访问node节点
	for(int i=1;i<n;i++)				//剩下n-1个节点
	{
     
		int minE=MAX;  					//minE赋一个较大值
		int flag;						//最短路的标号
		for(int j=0;j<n;j++)
		{
     
			if(visited[j] == false && dist[j] < minE)  //在dist[]中找最近的节点
			{
     
				minE = dist[j];
				flag = j;
			}
		}
		visited[flag] = true;				//访问最近的节点
		for(int j=0;j<n;j++)				//更新两个数组
		{
     
			if(dist[flag] + v[flag][j] < dist[j]) //如果通过flag节点到某一个节点j更近 就从flag节点通过 更新dist[] 和 path[]
			{
     
				dist[j] = dist[flag] + v[flag][j];
				path[j] = flag;
			}
		}
	}
}

int main()
{
     
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>v[i][j];

	Dijkstra(0);

	cout<<"dist: [";
	for(int i=0;i<n;i++)
		cout<<dist[i]<<" ";
	cout<<"]"<<endl;
	cout<<"path: [";
	for(int i=0;i<n;i++)
		cout<<path[i]+1<<" ";
	cout<<"]"<<endl;
}

input.txt

7
0 4 6 6 32767 32767 32767
32767 0 1 32767 7 32767 32767
32767 32767 0 32767 6 4 32767
32767 32767 2 0 32767 5 32767
32767 32767 32767 32767 0 32767 6
32767 32767 32767 32767 1 0 8
32767 32767 32767 32767 32767 0

output.txt

dist: [0 4 5 6 10 9 16 ]
path: [0 0 1 0 5 2 4 ]

你可能感兴趣的:(笔记,dijkstra,图论)