Dijkstra实现最短路径

#include<cstdio>
#include<iostream> 
#include<algorithm>
using namespace std;
const int MAXV=1000;
const int INF=100000000;
int n,m,s,G[MAXV][MAXV];
int d[MAXV];//起点到达各点的最短路径长度
bool vis[MAXV]={false};
void Dijkstra(int s){
	fill(d,d+MAXV,INF);
	d[s]=0;
	for(int i=0;i<n;i++){
		int u=-1,MIN=INF;
		for(int j=0;j<n;j++){
			if(vis[j]==false&&d[j]<MIN){
				u=j;
				MIN=d[j];
			}
		}
	if(u==-1) return;
	vis[u]=true;
	for(int v=0;v<n;v++){
		if(vis[v]==false&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){
			d[v]=d[u]+G[u][v];
		}
	}
}
}
int main(){
	int u,v,w;
	cin>>n>>m>>s;
	fill(G[0],G[0]+MAXV*MAXV,INF);
	for(int i=0;i<m;i++){
		cin>>u>>v>>w;
		G[u][v]=w;
	}
	Dijkstra(s);
	for(int i=0;i<n;i++){
		cout<<d[i]<<" ";
	}
	return 0;
}




测试:

6 8 0

0 1 1

0 3 4

0 4 4

1 3 2

2 5 1

3 2 2

3 4 3

4 5 3

代码解释:

 void d(){
	//初始化图
	//将出发点到出发点的距离设为0 
	for(循环n次){//n表示顶点数 
	//设当前欲访问的顶点下标为u=-1;
	//设所有点中到起点距离最短的那个点的路径长为MAX=100000000000; 
	for(循环n次){
		if(第n个点没有被访问&&该点到起点的路径最短){
			MAX=最短路径;
			u=n;//记录该点,即该点已经被访问 
		}
	} 
	if(u==-1) return;//所有点已经被访问,函数结束
	//标记u点被访问
	for(n次循环){
		if(该点没有被访问&&该点到新被访问顶点u的距离小于原来路径){
			//更新路径 
		}
	} 
	}		
}

  视频解释:https://www.bilibili.com/video/av38254646/?redirectFrom=h5

时间复杂度=n*(n+n)

关于该算法的题目和思想后续还会更新

猜你喜欢

转载自www.cnblogs.com/tao7/p/10237406.html