方法一:Dijkstra算法
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;//用来标记不通的路
const int maxx=1005;
int p[maxx];//用来记录前驱节点,其实这道题用不到这个数组
int dist[maxx];//源点到i之间的最短距离
int e[105][105];//记录路径
int n,m;
int vis[maxx];//标记这个点是否被访问过
void Print(int i){//递归求解路径 if(i==1)return;Print(p[i]);cout<<"->"<<i;
}
void Dijstra(int u){//核心算法memset(vis,0,sizeof(vis));dist[u]=0;for(int i=1;i<=n;i++){if(i!=u){dist[i]=e[u][i];p[i]=u;}}vis[u]=1;for(int i=1;i<=n;i++){int temp=inf;int t=u;for(int j=1;j<=n;j++){if(!vis[j]&&dist[j]<temp){temp=dist[j];t=j;}}if(t==u)break;vis[t]=1;for(int j=1;j<=n;j++){if(e[t][j]<inf){if(!vis[j]&&dist[j]>dist[t]+e[t][j]){dist[j]=dist[t]+e[t][j];p[j]=t;}}}}
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;memset(p,0,sizeof(p));memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){//初始化dist[i]=inf;for(int j=1;j<=n;j++){if(i==j){e[i][j]=0;//节点自身到自身为零}else{e[i][j]=inf;}}}for(int i=1;i<=m;i++){int a,b,cost;cin>>a>>b>>cost;e[a][b]=cost;}Dijstra(1);cout<<"各个顶点到"<<1<<"之间的最短距离: "<<endl;for(int i=1;i<=n;i++){cout<<1<<"->"<<i<<": "<<dist[i]<<endl;}cout<<"各个顶点到源点的路径: "<<endl;for(int i=1;i<=n;i++){cout<<1<<"->"<<i<<": "<<1;Print(i);cout<<endl;}}return 0;
}
/*
5 11
1 2 8
2 1 12
1 3 32
2 3 16
3 2 29
2 4 15
4 2 21
4 5 7
5 4 19
3 5 13
5 3 27
*/


方法二:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
const int maxx=1005;
const int inf=0x3f3f3f3f;
int dist[maxx];
int n,m,root;
int pre[maxx];
struct node{int u,v,w;
}num[maxx];
int Bellman_ford(int n,int m,int root){for(int i=1;i<=n;i++){if(i==root){dist[i]=0;}else{dist[i]=inf;}}//松弛int flag;for(int i=1;i<=n-1;i++){flag=1;for(int j=1;j<=m;j++){if(dist[num[j].v]>dist[num[j].u]+num[j].w){dist[num[j].v]=dist[num[j].u]+num[j].w;pre[num[j].v]=num[j].u;flag=0;}}if(flag==1)break;//当不存在更新的路径时,则跳出循环 }//判断是否含有负权回路  for(int i=1;i<=m;i++){if(dist[num[i].v]>dist[num[i].u]+num[i].w){return 0;}}return 1;
}
void print(int i,int root){if(i==root)return ;print(pre[i],root);printf("->%d",i);
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){memset(pre,0,sizeof(pre));root=1;//将根设置为1pre[root]=root; for(int i=1;i<=m;i++){scanf("%d %d %d",&num[i].u,&num[i].v,&num[i].w);}if(Bellman_ford(n,m,root)==1){cout<<"各个顶点到"<<1<<"之间的最短距离: "<<endl;for(int i=1;i<=n;i++){cout<<1<<"->"<<i<<": "<<dist[i]<<endl;}cout<<"各个顶点到源点的路径: "<<endl;for(int i=1;i<=n;i++){cout<<1<<"->"<<i<<": "<<1;print(i,root);cout<<endl;}}}return 0;
}
/*
5 11
1 2 8
2 1 12
1 3 32
2 3 16
3 2 29
2 4 15
4 2 21
4 5 7
5 4 19
3 5 13
5 3 27
*/


方法三:SPFA算法
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
vector<int>G[maxx];
queue<int>q;
int dist[maxx];
int e[maxx][maxx];
int pre[maxx];
int vis[maxx];
int n,m;
void SPFA_min(int n,int u){q.push(u);vis[u]=1;dist[u]=0; while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(dist[v]>dist[u]+e[u][v]){dist[v]=dist[u]+e[u][v];pre[v]=u;if(vis[v]==0){q.push(v);vis[v]=1;}}}}
}
void print(int i){if(i==1)return ;print(pre[i]);cout<<"->"<<i;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;memset(pre,0,sizeof(pre));memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){dist[i]=inf;for(int j=1;j<=n;j++){e[i][j]=inf;}}for(int i=1;i<=m;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);G[a].push_back(b);G[b].push_back(a);if(e[a][b]>cost){e[a][b]=e[b][a]=cost;}}SPFA_min(n,1);cout<<"各个顶点到"<<1<<"之间的最短距离: "<<endl;for(int i=1;i<=n;i++){cout<<1<<"->"<<i<<": "<<dist[i]<<endl;}cout<<"各个顶点到源点的路径: "<<endl;for(int i=1;i<=n;i++){cout<<1<<"->"<<i<<": "<<1;print(i);cout<<endl;}}return 0;
}
/*
5 11
1 2 8
2 1 12
1 3 32
2 3 16
3 2 29
2 4 15
4 2 21
4 5 7
5 4 19
3 5 13
5 3 27
*/

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxx=1005;
int e[maxx][maxx];
int vis[maxx];
int n,m;
void Flody(){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){e[i][j]=min(e[i][k]+e[k][j],e[i][j]);}}}
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){for(int i=0;i<=n;i++){for(int j=0;j<=n;j++){if(i==j){e[i][j]=0;}else{e[i][j]=inf;}}}for(int i=1;i<=m;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);e[a][b]=cost;}Flody();cout<<"源点"<<1<<"到其他点的最短距离: "<<endl;for(int i=2;i<=n;i++){cout<<1<<"->"<<i<<": "<<e[1][i]<<endl;}}return 0;
}/*
5 11
1 2 8
2 1 12
1 3 32
2 3 16
3 2 29
2 4 15
4 2 21
4 5 7
5 4 19
3 5 13
5 3 27
*/


这是我在做题和学习中总结出来的,如果存在什么问题或者错误,请指出!谢谢!

求解单源最短路径的几种算法相关推荐

  1. c++ 单源最短路径-狄杰斯特拉算法

    文章目录 源码 输出 狄杰斯特拉算法 适用范围:没有负权重的图, 可以有环,有向无向图均可 求解问题:单源最短路径 时间复杂度:V^2 源码 #include <iostream> #in ...

  2. Dijkstra算法求解单源最短路径问题

    文章目录 一 前言 二 Dijkstra 算法讲解 1. 贪心算法的证明 2. 算法实现说明 3. 初版Dijkstra算法代码 三 时间复杂度优化 1. 优化策略 2. 优化后的代码 四 结语 一 ...

  3. 单源最短路径问题(dijkstra算法)

    一.问题描述 给定一个随机带权有向图,每条边的权是一个实数.另外给定图中一个顶点,称为源.计算源到各顶点的最短路径长度(即距离),要求能随机生成图,随机指定源点计算出到顶点的最短距离. 二.解题思路 ...

  4. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

  5. 标号法求解单源最短路径

    1. 问题描述 给定一个图结构,包含n个点,e条边,求解源点 s 到汇点 t 的最短路径及长度,以及源点 s 到前1000个点的最短路径长度. 数据文件"union.txt",格式 ...

  6. 四种不同单源最短路径算法性能比较

    四种不同单源最短路径算法性能比较   一.最短路径问题描述 单源最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数.另外,还给定V中的一个顶点,称之为源.现在要计算从源到其他各顶点的 ...

  7. 四种单源最短路径算法

      一.最短路径问题描述 单源最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数.另外,还给定V中的一个顶点,称之为源.现在要计算从源到其他各顶点的最短路径的长度.这里的路径长度指的 ...

  8. 单源最短路径Dijkstra算法的思想、详细步骤、代码

    目录 一.算法思想 二.算法详细步骤 三.伪代码 + C++代码 四.算法复杂度分析 五.算法改进 六.应用案例 一.算法思想 1.Dijkstra 算法是用来求解单源最短路径问题的经典算法,其本质上 ...

  9. Python单源最短路径算法汇总

    给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问题通常称为单源最短路径问 ...

最新文章

  1. WebService实例-CRM系统提供WebService实现用户注册功能
  2. Qt-QMessageBox用法详解
  3. 桂林电子科技大学C语言大作业,桂林电子科技大学c语言程序设计习题集及答案qvzaewzm.doc...
  4. SQL Server 常用分页SQL
  5. linux文件IO——文件IO介绍
  6. 关于c语言编写 单项链表 的创建、插入、修改、删除、显示、退出 的程序案例
  7. 业余学习python有用吗_对于那些不做编程工作的小伙伴来说,学习Python有什么用呢?...
  8. 条款5:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)...
  9. react大数据量渲染_UseEffect在React中运行无限渲染(超过最大更新深度)
  10. 软件测试学习笔记之工具江湖的神兵利器
  11. 我们——程序员应该关注,功能?设计?
  12. Microsoft Office (Visio)安装与激活
  13. 回顾安全多方计算-SMPC(MPC)
  14. 【问】安装SQLserver2000 SP4补丁报错提示0*80070005.程序未能注册
  15. txt电子书如何用安卓手机完美打开?
  16. 人机工程学产品设计案例_产品设计|手持产品设计案例大放送,手持类的产品设计要点...
  17. Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
  18. 【渝粤题库】广东开放大学 电子商务职业技能 形成性考核
  19. 告别电子小白,8个优选DS1302数字时钟方案大合辑
  20. 永磁同步电机直接转矩控制(PMSM-DTC)simulink仿真

热门文章

  1. 数据结构之列表 timeit
  2. MySQL数据库排序order by(asc、desc)
  3. Python在ubuntu中更改Python和pip指向
  4. maven的setting.xml文件配置信息【仅仅更改了一处】
  5. Java基础。public,private,static变量!以及一个实例化的小例子 以及方法
  6. Python+OpenCV实现自动扫雷,创造属于自己的世界记录!
  7. 机器视觉系统设计关键:成像基准
  8. 给大家分享一个私藏已久的Python神器!
  9. 基于Python查找图像中最常见的颜色
  10. 从“我是谁”到人工智能的原点,机器学习的路在何方