单源最短路径算法
时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快)
不支持有负权的图
#include<iostream> using namespace std; const int maxn=1024; const int inf=1<<30; int n,m; int d[maxn]; int v[maxn]; int G[maxn][maxn]; void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) G[i][j]=(i==j?0:inf); for(int i=2;i<=n;i++) d[i]=inf,v[i]=0; d[1]=0;//这里默认是以1作为起点的 v[1]=0; } int main() { int from,to,dist; cin>>n>>m; init(); for(int i=0;i<m;i++){ cin>>from>>to>>dist; G[from][to]=G[to][from]=dist; } for(int i=1;i<=n;i++){ int x,m=inf; for(int j=1;j<=n;j++){ if(!v[j]&&d[j]<m)//写成'<'而不是'<='必须要确保图是联通的 m=d[x=j]; } v[x]=1; for(int j=1;j<=n;j++){ if(G[x][j]<inf/*防止溢出*/&&G[x][j]+d[x]<d[j]) d[j]=G[x][j]+d[x]; } } return 0; }
优化后代码
//迪杰斯特拉算法的优化 #include<iostream> #include<vector> #include<queue> using namespace std; const int maxn=1024; const int inf=1<<30; struct Edge{ int f,t,d; }; struct Node{ int d,u; bool operator<(const Node& b)const{ return d>b.d; } }; int n,m; int d[maxn],v[maxn]; vector<int> G[maxn]; vector<Edge> edges; priority_queue<Node> Q; void init(){ for(int i=1;i<=n;i++) G[i].clear(); for(int i=1;i<=n;i++) v[i]=0; for(int i=2;i<=n;i++) d[i]=inf; d[1]=0; } int main() { int from,to,dist; cin>>n>>m; init(); for(int i=0;i<m;i++){ cin>>from>>to>>dist; edges.push_back((Edge){from,to,dist}); G[from].push_back(edges.size()-1); edges.push_back((Edge){to,from,dist}); G[to].push_back(edges.size()-1); } Q.push((Node){0,1}); while(!Q.empty()){ Node x=Q.top();Q.pop(); int u=x.u; if(v[u]) continue; v[u]=1; for(int i=0;i<G[u].size();i++){ Edge& e=edges[G[u][i]]; if(d[e.t]>d[u]+e.d){ d[e.t]=d[u]+e.d; Q.push((Node){d[e.t],e.t}); } } } return 0; }