3最短路的几种解法 ------例题 最短路
点击进入例题 最短路
我知道的有三种方法 1 : 深搜 每次 每次有更小的路径时 就更新 , 2 : Dijkstra 3 : floyd
前两种 是 单源 最短路径 , 如果是 求 单源最短路径的话 就用前面的 两种 , 但是 如果求的是 多源最短路径的话 最好是还用 floyd 时间复杂度 相对较低 . 用floyd 求单源最短路径的话 .... 时间复杂度 搞那么一点点 不过 程序实现简单 ,
1 : floyd 的 实现方法
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<stack> #include<string> #include<sstream> #include<map> #include<cctype> using namespace std; #define INF 99999999 int main() {int e[101][101];int n,m,a,b,c,i,j,k;while(~scanf("%d %d",&n,&m)&&n!=0&&m!=0){for(i=1;i<=n;i++) // 将 各个边 初始化 为 最大值 for(j=1;j<=n;j++)e[i][j]=INF;while(m--){scanf("%d%d%d",&a,&b,&c); // 确定边 和 边长 e[b][a]=e[a][b]=c; }for(k=1;k<=n;k++) //Floyd核心算法... { for(i=1;i<=n;i++) // 所有的 路 都让 k 加进去试试 {for(j=1;j<=n;j++) //如果 从 i到j的路上 有k 走的会更轻松的话 , 那就让 k 去吧 {if(e[i][j]>e[i][k]+e[k][j]) // 判断 是否会 更加轻松 e[i][j]=e[i][k]+e[k][j];}}}printf("%d\n",e[1][n]);} }
2 : 深搜完成 . ( 超时 ..... 数据处理应该是没有问题的 )
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 using namespace std; 15 #define INF 99999999 16 int n,m,a[105][105],result; 17 vector<int>v[105]; 18 void DFS(int star,int dis) 19 { 20 if(dis>=result) 21 return; 22 if(star==n) 23 { 24 result=result>dis?dis:result; 25 return ; 26 } 27 for(int i=0;i<v[star].size();i++) 28 { 29 if(a[star][v[star][i]]!=INF) 30 { 31 int w=a[star][v[star][i]]; 32 a[star][v[star][i]]=INF; 33 a[v[star][i]][star]=INF; 34 DFS(v[star][i],w+dis); 35 a[star][v[star][i]]=w; 36 a[v[star][i]][star]=w; 37 } 38 } 39 } 40 int main() 41 { 42 for(int i=0;i<105;i++) 43 for(int j=0;j<105;j++) 44 a[i][j]=INF; 45 while(scanf("%d%d",&n,&m),(m||m)) 46 { 47 result=INF; 48 for(int i=0;i<m;i++) 49 { 50 int d,b,c; 51 scanf("%d%d%d",&d,&b,&c); 52 v[d].push_back(b); 53 v[b].push_back(d); 54 a[d][b]=c; 55 a[b][d]=c; 56 } 57 DFS(1,0); // 从 1 到 n . 58 printf("%d\n",result); 59 } 60 }
3 : Dijkstra ( 也就这一个比较有意思一点 ) < 归根结底 所有的算法 都是 模拟 ... >
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 #define N 0x1f1f1f1f 6 int w[151][151]; 7 int d[155]; 8 int ans,vis[151]; 9 int n,m; 10 void Dij() // Dijkstra 11 { 12 int i,j,k,v,tmp; 13 memset(vis,0,sizeof(vis)); 14 for(i=1;i<=n;i++) // 图 中 每个节点 和 1 的距离 不是直接相邻的 就是 正无穷 15 d[i]=w[1][i]; 16 d[1]=0; 17 vis[1]=1; 18 for(i=1;i<=n;i++) 19 { 20 tmp=N; 21 for(j=1;j<=n;j++) 22 { 23 if(tmp>d[j]&&!vis[j]) // 从中 找到一个 和 1 最近的点 ( 这就是 怪姥姥讲的 已经有的 确定集合了吧 ) 24 { 25 tmp=d[j]; 26 v=j; // 记录下来 那一个端点的 标号 27 } 28 } 29 vis[v]=1; // 最短的 端点 假如集合 , 标记为 已经在 集合以内 30 for(k=1;k<=n;k++) 31 { 32 if(!vis[k]) // 将所有 集合之外 但是 和 集合之中 最少一个元素相连的元素 的长度 算一下 33 d[k]=min(d[k],d[v]+w[v][k]); // 但是 不让他们加进去 一会 在上面 检查一个最小的 假如已经确定长度的 集合之中 34 } 35 } 36 } 37 int main() 38 { 39 printf("%d",N); 40 while(~scanf("%d%d",&n,&m)) 41 { 42 if(n==0&&m==0)break; 43 for(int i=1;i<=n;i++) 44 { 45 for(int j=1;j<=n;j++) 46 { 47 w[i][j]=0x1f1f1f1f; 48 } 49 } 50 for(int i=0;i<m;i++) 51 { 52 int a,b,dis; 53 scanf("%d%d%d",&a,&b,&dis); 54 if(w[a][b]>dis) 55 w[a][b]=w[b][a]=dis; 56 } 57 Dij(); 58 printf("%d\n",d[n]); 59 } 60 }
转载于:https://www.cnblogs.com/A-FM/p/5373849.html
3最短路的几种解法 ------例题 最短路相关推荐
- 最短路的两种解法Dijkstra和spfa
最短路算法 问题描述 在加权图上,两点之间的最小边权和路径称为最短路径. 常用算法 Dijkstra算法 Dijkstra算法本质上可以看做一种贪心算法,即每次由已定最短路点集找出最小拓展点,并把最小 ...
- 22行代码AC,三种解法——例题3-6_环状序列(UVa-1584)
励志用尽量少的代码做高效表达 题目(提交)链接-->Uva-1584 因为是水题,因此做题重心由解题转向优化 核心思路: 本题共有三种解法: 解法一.string字符串中assign()+era ...
- BZOJ3387栅栏(另一种解法:spfa)
题目描述 + 讲解 经典例题了,常规解法是 用线段树优化dp数组,dp很好想,线段树优化难写. 这里我给出另一种解法,最短路spfa.(也不好想) 因为只要求x轴上的运动路径.所以只有栅栏的边界是有用 ...
- 牛客--追债之旅 两种解法
文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...
- usaco Ordered Fractions 顺序的分数(两种解法)
这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...
- 青蛙跳台阶c语言递归函数,青蛙跳台阶问题的四种解法
http://raychase.iteye.com/blog/1337359 题目:一只青蛙一次可以跳1级台阶,也可以跳2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 这道题还被ITEye放在了博 ...
- opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...
平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...
- 约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...
- java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)
这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...
最新文章
- Linux设备驱动开发概述
- LinuxWorld 2007:Linux从狂热走向理性
- HashMap之三问为什么及性能问题
- 【Linux】用户与权限
- ExtJs4 笔记 Ext.tab.Panel 选项卡
- 2.3 指数加权平均
- 搭建vue-cli脚手架
- 管理新语:主管要辅导员工转正
- 开源:OpenJDK8 AARCH64(ARM)
- g4900 win7 核显驱动_INTEL WIN7核显驱动电脑端下载-支持8、9代CPU pc下载
- Python数据分析入门(1)——数据分析基础步骤知识
- 电子秤称东西用计算机怎么算,电子秤怎么连接电脑?
- WebService实例
- YbSoftwareFactory 代码生成插件【二十三】:集成强大的公文流转系统
- AtCoder Beginner Contest 160 A ~ E
- 注册表被禁用 (备用)
- ‘couldn‘t find a common superview for 问题记录
- 保研至暗时,九推可能是你最后的机会!
- html多行注释正则表达式,RegEx用于匹配/替换JavaScript注释(多行和内联)
- python实现图像的白平衡,破坏图像的白平衡(冷、暖)和调节图像的亮度
热门文章
- Lync server 2010部署及解决方案
- 隐藏在程序旮旯中的“安全问题”
- 多条记录取最前面一条或根据条件任取N条
- 通过源代码研究ASP.NET MVC中的Controller和View(二)
- java大整数类减1,自己写Java大整数《1》表示和加减
- php正则替换%3cbr%3e_php利用正则替换过滤掉js(script)代码
- Java类与匿名内部类
- 使用C++实现单项选择题标准化考试系统设计
- NC14414 小AA的数列
- html中引入ifrim视频,Making Of Rallypoint - Outer Rim