点击进入例题   最短路     

我知道的有三种方法 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最短路的几种解法 ------例题< 最短路 >的更多相关文章

  1. [LeetCode] Remove Element (三种解法)

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  2. codewars.DNA题目几种解法分析(字符串替换)

    题干: 意思就是字符串替换,"A"与"C"配对,"T"与"G"配对,DNA不为空. 解法一:我的解法,用for循环遍历字 ...

  3. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  4. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  5. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  6. LeetCode算法题-Longest Palindrome(五种解法)

    这是悦乐书的第220次更新,第232篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第87题(顺位题号是409).给定一个由小写或大写字母组成的字符串,找到可以用这些字母构 ...

  7. LeetCode算法题-Find the Difference(Java实现-五种解法)

    这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...

  8. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

  9. LeetCode算法题-Intersection of Two Arrays(Java实现-四种解法)

    这是悦乐书的第207次更新,第219篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第75题(顺位题号是349).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...

随机推荐

  1. Go:值类型、引用类型

    值类型,变量存的就是值本身: in系列t.float系列.bool.string.数组和struct 引用类型,变量存的是一个地址,这是地址存的才是值本身: 指针.slice.map.chan.int ...

  2. linux cmp-比较两个文件是否有差异

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 cmp命令用来比较两个文件是否有差异.当相互比较的两个文件完全一样时,则该指令不会显示任何信息.若发现有差异,预设会标示出第一个不通 ...

  3. Latex Notes

    latex Table of Contents 1. Presentation/Slides with Beamer 2. Drawing in LaTex With TikZ 3. Tracked ...

  4. 初学hash

    hash定义: Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种 ...

  5. PAT 1135 Is It A Red-Black Tree

    There is a kind of balanced binary search tree named red-black tree in the data structure. It has th ...

  6. textarea 高度调整

    textarea 高度调整 通过 rows 属性调整 高度

  7. 【Codeforces 494A】Treasure

    [链接] 我是链接,点我呀:) [题意] 让你把"#"用至少一个右括号代替 使得整个括号序列合法 [题解] 首先我们不要考虑井号 考虑最简单的括号序列 并且把左括号看成1,右括号看 ...

  8. [置顶] Java Web学习总结(25)——MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建

    这次换了台电脑,所以需要重新配置一次项目开发环境,过程中的种种,记录下来,便于以后再次安装,同时给大家一个参考. 1.JDK的安装 首先下载JDK,这个从sun公司官网可以下载,根据自己的系统选择64 ...

  9. BNUOJ 2461 Anniversary party

    Anniversary party Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Origi ...

  10. Python学习笔记 (1)Hello World(环境搭建+输出Hello World!)

    随想 高考发挥失常.科三遇火车发挥失常,各种不顺……突然发现假期都快没了,才想起高考前想象的这个假期要做的一堆事,现在来多完成一件吧. 这几篇博客仅只是我的学习笔记,凑合看吧.我这个python小白看 ...