点击进入例题   最短路     

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

  1. 最短路的两种解法Dijkstra和spfa

    最短路算法 问题描述 在加权图上,两点之间的最小边权和路径称为最短路径. 常用算法 Dijkstra算法 Dijkstra算法本质上可以看做一种贪心算法,即每次由已定最短路点集找出最小拓展点,并把最小 ...

  2. 22行代码AC,三种解法——例题3-6_环状序列(UVa-1584)

    励志用尽量少的代码做高效表达 题目(提交)链接-->Uva-1584 因为是水题,因此做题重心由解题转向优化 核心思路: 本题共有三种解法: 解法一.string字符串中assign()+era ...

  3. BZOJ3387栅栏(另一种解法:spfa)

    题目描述 + 讲解 经典例题了,常规解法是 用线段树优化dp数组,dp很好想,线段树优化难写. 这里我给出另一种解法,最短路spfa.(也不好想) 因为只要求x轴上的运动路径.所以只有栅栏的边界是有用 ...

  4. 牛客--追债之旅 两种解法

    文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...

  5. usaco Ordered Fractions 顺序的分数(两种解法)

    这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...

  6. 青蛙跳台阶c语言递归函数,青蛙跳台阶问题的四种解法

    http://raychase.iteye.com/blog/1337359 题目:一只青蛙一次可以跳1级台阶,也可以跳2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 这道题还被ITEye放在了博 ...

  7. opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...

    平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...

  8. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  9. java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

    这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...

最新文章

  1. Linux设备驱动开发概述
  2. LinuxWorld 2007:Linux从狂热走向理性
  3. HashMap之三问为什么及性能问题
  4. 【Linux】用户与权限
  5. ExtJs4 笔记 Ext.tab.Panel 选项卡
  6. 2.3 指数加权平均
  7. 搭建vue-cli脚手架
  8. 管理新语:主管要辅导员工转正
  9. 开源:OpenJDK8 AARCH64(ARM)
  10. g4900 win7 核显驱动_INTEL WIN7核显驱动电脑端下载-支持8、9代CPU pc下载
  11. Python数据分析入门(1)——数据分析基础步骤知识
  12. 电子秤称东西用计算机怎么算,电子秤怎么连接电脑?
  13. WebService实例
  14. YbSoftwareFactory 代码生成插件【二十三】:集成强大的公文流转系统
  15. AtCoder Beginner Contest 160 A ~ E
  16. 注册表被禁用 (备用)
  17. ‘couldn‘t find a common superview for 问题记录
  18. 保研至暗时,九推可能是你最后的机会!
  19. html多行注释正则表达式,RegEx用于匹配/替换JavaScript注释(多行和内联)
  20. python实现图像的白平衡,破坏图像的白平衡(冷、暖)和调节图像的亮度

热门文章

  1. Lync server 2010部署及解决方案
  2. 隐藏在程序旮旯中的“安全问题”
  3. 多条记录取最前面一条或根据条件任取N条
  4. 通过源代码研究ASP.NET MVC中的Controller和View(二)
  5. java大整数类减1,自己写Java大整数《1》表示和加减
  6. php正则替换%3cbr%3e_php利用正则替换过滤掉js(script)代码
  7. Java类与匿名内部类
  8. 使用C++实现单项选择题标准化考试系统设计
  9. NC14414 小AA的数列
  10. html中引入ifrim视频,Making Of Rallypoint - Outer Rim