最短路基础总结(Floyd Dijkstra SPFA)

xiaoxiao2021-02-27  185

只是想记录一下这三个最短路算法的模板。

Floyd:

//邻接矩阵mp[N][N]; //把各个点之间的最短路全算出来了。 //时间复杂度:O(n^3) void floyd() { for(int k=1; k<=n; k++) { for(int i=1; i<=n; i++) { if(mp[i][k]!=inf) for(int j=1; j<=n; j++) { if(mp[i][k]+mp[k][j]<mp[i][j]) { mp[i][j]=mp[i][k]+mp[k][j]; } } } } }

Dijkstra:

//邻接矩阵mp[N][N] //单源最短路 //时间复杂度:O(n^2) void dijkstra(int b,int e) { for(int i=0;i<n;i++) { dis[i]=mp[b][i]; } dis[b]=0; flag[b]=1; for(int i=1;i<=m;i++) { int min=MAX; int k; for(int j=0;j<n;j++) { if(!flag[j]&&min>dis[j]) { min=dis[j]; k=j; } } if(min==MAX) break; flag[k]=1; for(int j=0;j<n;j++) { if(!flag[j]&&dis[j]>dis[k]+mp[k][j]) { dis[j]=dis[k]+mp[k][j]; } } } }

SPFA:

//邻接矩阵mp[N][N] 邻接表直接看题吧 //单源最短路 //时间复杂度:O(kE) E为边数,k为所有顶点进队的平均次数 void spfa(int s) { queue<int> q; while(!q.empty()) { q.pop(); } memset(vis,0,sizeof vis); for(int i=0;i<n;i++) { dis[i]=inf; } q.push(s); dis[s]=0;vis[s]=1; while(!q.empty()) { int now=q.front(); q.pop();vis[now]=0; for(int i=0;i<n;i++) { if(dis[i]>mp[now][i]+dis[now]) { dis[i]=mp[now][i]+dis[now]; if(!vis[i]) { q.push(i); vis[i]=1; } } } } } 还未学习Dijkstra SPFA的各种优化。

转载请注明原文地址: https://www.6miu.com/read-9489.html

最新回复(0)