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).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...
随机推荐
- Hadoop Mapreduce 中的Partitioner
Partitioner的作用的对Mapper产生的中间结果进行分片,以便将同一分组的数据交给同一个Reduce处理,Partitioner直接影响Reduce阶段的负载均衡. MapReduce提供了 ...
- CentOS7 安装 PHP7.2
点击查看原文 安装源 安装 EPEL 软件包: $ sudo yum install epel-release 安装 remi 源: $ sudo yum install http://rpms.re ...
- Springboot druid监控配置
@Configuration public class DataSourceConfig { @Bean public ServletRegistrationBean statViewServlet( ...
- Sigmoid Function
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51734189 Sigmodi 函数是一 ...
- 邮票(codevs 2033)
题目描述 Description 已知一个 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 例如,假设有 ...
- [bzoj3809]Gty的二逼妹子序列_莫队_分块
Gty的二逼妹子序列 bzoj-3809 题目大意:给定一个n个正整数的序列,m次询问.每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个. 注释:$1\le n\ ...
- [poj1704]Georgia and Bob_博弈论
Georgia and Bob poj-1704 题目大意:题目链接 注释:略. 想法:我们从最后一个球开始,每两个凑成一对.如果有奇数个球,那就让第一个球和开始位置作为一对. 那么如果对手移动的是一 ...
- Hadoop2.0之YARN
YARN(Yet Another Resource Negotiator)是Hadoop2.0集群中负责资源管理和调度以及监控运行在它上面的各种应用,是hadoop2.0中的核心,它类似于一个分布式操 ...
- centos忘了root用户密码
centos5.5启动时,按“空格”,到出现系统菜单GNU GRUB 第二步:按“e”进入编辑此GRUB界面 第三步:选择“rhgb quiet”此行,再按“e”进入编辑界面,在rhgb quiet后 ...
- HDU 5305(Friends-暴搜)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...