1. 程式人生 > >Dijkstra實現最短路徑

Dijkstra實現最短路徑

main https 下標 () ios redirect www 距離 con

#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)

關於該算法的題目和思想後續還會更新

Dijkstra實現最短路徑