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[][];
int n,m,a,b,c,i,j,k;
while(~scanf("%d %d",&n,&m)&&n!=&&m!=)
{
for(i=;i<=n;i++) // 将 各个边 初始化 为 最大值
for(j=;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=;k<=n;k++) //Floyd核心算法...
{
for(i=;i<=n;i++) // 所有的 路 都让 k 加进去试试
{
for(j=;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[][n]);
}
}
2 : 深搜完成 . ( 超时 ..... 数据处理应该是没有问题的 )
#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 n,m,a[][],result;
vector<int>v[];
void DFS(int star,int dis)
{
if(dis>=result)
return;
if(star==n)
{
result=result>dis?dis:result;
return ;
}
for(int i=;i<v[star].size();i++)
{
if(a[star][v[star][i]]!=INF)
{
int w=a[star][v[star][i]];
a[star][v[star][i]]=INF;
a[v[star][i]][star]=INF;
DFS(v[star][i],w+dis);
a[star][v[star][i]]=w;
a[v[star][i]][star]=w;
}
}
}
int main()
{
for(int i=;i<;i++)
for(int j=;j<;j++)
a[i][j]=INF;
while(scanf("%d%d",&n,&m),(m||m))
{
result=INF;
for(int i=;i<m;i++)
{
int d,b,c;
scanf("%d%d%d",&d,&b,&c);
v[d].push_back(b);
v[b].push_back(d);
a[d][b]=c;
a[b][d]=c;
}
DFS(,); // 从 1 到 n .
printf("%d\n",result);
}
}
3 : Dijkstra ( 也就这一个比较有意思一点 ) < 归根结底 所有的算法 都是 模拟 ... >
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 0x1f1f1f1f
int w[][];
int d[];
int ans,vis[];
int n,m;
void Dij() // Dijkstra
{
int i,j,k,v,tmp;
memset(vis,,sizeof(vis));
for(i=;i<=n;i++) // 图 中 每个节点 和 1 的距离 不是直接相邻的 就是 正无穷
d[i]=w[][i];
d[]=;
vis[]=;
for(i=;i<=n;i++)
{
tmp=N;
for(j=;j<=n;j++)
{
if(tmp>d[j]&&!vis[j]) // 从中 找到一个 和 1 最近的点 ( 这就是 怪姥姥讲的 已经有的 确定集合了吧 )
{
tmp=d[j];
v=j; // 记录下来 那一个端点的 标号
}
}
vis[v]=; // 最短的 端点 假如集合 , 标记为 已经在 集合以内
for(k=;k<=n;k++)
{
if(!vis[k]) // 将所有 集合之外 但是 和 集合之中 最少一个元素相连的元素 的长度 算一下
d[k]=min(d[k],d[v]+w[v][k]); // 但是 不让他们加进去 一会 在上面 检查一个最小的 假如已经确定长度的 集合之中
}
}
}
int main()
{
printf("%d",N);
while(~scanf("%d%d",&n,&m))
{
if(n==&&m==)break;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
w[i][j]=0x1f1f1f1f;
}
}
for(int i=;i<m;i++)
{
int a,b,dis;
scanf("%d%d%d",&a,&b,&dis);
if(w[a][b]>dis)
w[a][b]=w[b][a]=dis;
}
Dij();
printf("%d\n",d[n]);
}
}
3最短路的几种解法 ------例题< 最短路 >的更多相关文章
- [LeetCode] Remove Element (三种解法)
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- codewars.DNA题目几种解法分析(字符串替换)
题干: 意思就是字符串替换,"A"与"C"配对,"T"与"G"配对,DNA不为空. 解法一:我的解法,用for循环遍历字 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
- LeetCode算法题-Number Complement(Java实现-五种解法)
这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...
- LeetCode算法题-Third Maximum Number(Java实现-四种解法)
这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...
- LeetCode算法题-Longest Palindrome(五种解法)
这是悦乐书的第220次更新,第232篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第87题(顺位题号是409).给定一个由小写或大写字母组成的字符串,找到可以用这些字母构 ...
- LeetCode算法题-Find the Difference(Java实现-五种解法)
这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...
- LeetCode算法题-Valid Perfect Square(Java实现-四种解法)
这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...
- LeetCode算法题-Intersection of Two Arrays(Java实现-四种解法)
这是悦乐书的第207次更新,第219篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第75题(顺位题号是349).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...
随机推荐
- reshape column vector data in Matlab
input: import data 2. transpose the data 3. reshape the data into array code: matlab load x.dat X=x ...
- x component of 2nd stokes wave--- C code
* Source code The following is a C code for x component of 2nd stokes wave ××××××××××××××××××××× /*s ...
- 自己动手编写vue插件
一.为什么要自己动手写插件呢,原因有二: 其一:是因为最近产品了提了一个在web端接收,消息通知的需求,产品要求在若干个页面内如果有消息,就要弹出消息弹窗展示给用户,略加思索之后,第一反应就是写个消息 ...
- Eclipse不编译解决方案
原文链接:http://blog.csdn.net/huahuagongzi99999/article/details/7719882 转来自己用 这两天Eclipse 不编译了,无论怎么更改保 ...
- [NOIP2004]FBI树
题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三 ...
- SSH三种框架及表示层、业务层和持久层的理解(转)
Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...
- HBase连接数据库(集群)
一.使用java接口对hbase进行表的创建1.引入需要的jar包2.代码: public static void main(String[] args) throws Exception { //得 ...
- spring-quartz定时器简单用法
基本配置: 1.quartz.properties #============================================================== #Configure ...
- poj——2084 Game of Connections
Game of Connections Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8664 Accepted: 42 ...
- 类似于SVN的文档内容差异对比工具winmerge
原文:http://www.jianshu.com/p/99282a4f3870 https://sourceforge.net/projects/winmerge/?source=typ_redir ...