14. Floyd + 朴素版Dijkstra

  • Floyd(多源最短路径)(O(n^3))
    • 练习
      • A - 最短路 HDU - 2544 (模板)
      • F - Cow Contest POJ - 3660 (微变形)
      • C - 一个人的旅行 HDU - 2066 (Floyd+剪枝)
  • Dijkstra算法朴素版 (单源最短路径)(O(n^2))
    • 练习
      • I - Til the Cows Come Home POJ - 2387 (模板)
      • D - Choose the best route HDU - 2680 (记录一个奇奇怪怪的wa点)

Floyd(多源最短路径)(O(n^3))

练习

A - 最短路 HDU - 2544 (模板)

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int MAX=0x3f3f3f3f;
int n,m,a,b,c;
int dis[110][110];  //记录两点间最短距离 void floyd()
{for(int k=1;k<=n;k++)   //中间点(必须放最外围) {for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//如果存在点k使得i到k的距离+k到j的距离比i到j的距离小,就更新i、j之间最短距离 }}
}int main()
{while(cin>>n>>m&&(m+n)) {for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j) dis[i][j]=0;else       dis[i][j]=MAX; //初始化任意两点间距离为无穷 }}while(m--){cin>>a>>b>>c;dis[a][b]=min(dis[a][b],c);    //邻接矩阵 记录两点间距离(取最小) dis[b][a]=dis[b][a];   //无向图 }floyd();cout<<dis[1][n]<<endl;   //1到n的最小距离 }return 0;
}

F - Cow Contest POJ - 3660 (微变形)

N (1 ≤ N ≤ 100) cows, conveniently numbered 1…N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors.
The contest is conducted in several head-to-head rounds, each between two cows. If cow A has a greater skill level than cow B (1 ≤ A ≤ N; 1 ≤ B ≤ N; A ≠ B), then cow A will always beat cow B.
Farmer John is trying to rank the cows by skill level. Given a list the results of M (1 ≤ M ≤ 4,500) two-cow rounds, determine the number of cows whose ranks can be precisely determined from the results. It is guaranteed that the results of the rounds will not be contradictory.
Input

  • Line 1: Two space-separated integers: N and M
  • Lines 2…M+1: Each line contains two space-separated integers that describe the competitors and results (the first integer, A, is the winner) of a single round of competition: A and B
    Output
  • Line 1: A single integer representing the number of cows whose ranks can be determined
    Sample Input
    5 5
    4 3
    4 2
    3 2
    1 2
    2 5
    Sample Output
    2
    AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m;
bool arr[110][110];
int cnt[110],ans;void floyd()
{//传递闭包 for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)arr[i][j]=arr[i][j]||(arr[i][k]&&arr[k][j]);//如果i等级高于k且k等级高于i 或者 已经知道i等级高于j }}
}int main()
{ans=0;     memset(arr,0,sizeof(arr)); //记录状态,有关系为1,没关系为0 memset(cnt,0,sizeof(cnt)); //记录与可以与i确认等级高低的人的数量 cin>>n>>m;while(m--){int a,b;cin>>a>>b;arr[a][b]=1;}floyd();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if((arr[i][j]||arr[j][i])&&i!=j)   //如果i等级高于j或j等级高于i cnt[i]++;}if(cnt[i]==n-1) ans++;}cout<<ans<<endl;return 0;
}

C - 一个人的旅行 HDU - 2066 (Floyd+剪枝)

虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,0),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9
AC代码:
多源最短路径,这里城市标号范围到1000,Floyd时间复杂度n^3,不剪枝的话会TLE。
还有个点是Floyd里面三重循环的那个ijk不要轻易动,除了剪枝还是让它去遍历每一个点。(wa了无数发后学的教训呜呜呜)
我居然改了之后还沾沾自喜想自己真聪明别人肯定都想不到呜呜呜天呐怎么会有我这么蠢的人

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
const int MAX=0x3f3f3f3f;
int t,s,d,a,b,n,time,ans;
int dis[1100][1100];
int cs[1100];void floyd()
{for(int k=1;k<=n;k++){for(int i=1;i<=n;i++)  //注意这里i以及下面j是遍历1到n而不是仅仅遍历cs里的城市,会有缺失 {if(dis[i][k]==MAX)   continue;   //剪枝,如果i、k不可达 for(int j=1;j<=n;j++){if(dis[k][j]==MAX)  continue;   //同上 dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);}}}
}int main()
{while(scanf("%d%d%d",&t,&s,&d)!=EOF){//初始化 memset(cs,0,sizeof(cs));for(int i=1;i<1100;i++){for(int j=1;j<1100;j++){if(i==j)   dis[i][j]=0;else   dis[i][j]=MAX;}}n=0,ans=MAX; while(t--){scanf("%d%d%d",&a,&b,&time);dis[a][b]=min(dis[a][b],time);dis[b][a]=dis[a][b];   //无向 n=max(n,max(a,b));        //记录出现的标号最大的城市,后续floyd节省时间 }for(int i=1;i<=s+d;i++)      scanf("%d",&cs[i]);       //记录周边城市以及想去的城市标号 floyd();  //多源最短路算法 for(int i=1;i<=s;i++)  //遍历周边每座城市与每个目标城市的组合 {for(int j=s+1;j<=s+d;j++)ans=min(dis[cs[i]][cs[j]],ans);        //取最小值 }printf("%d\n",ans);}return 0;
}

Dijkstra算法朴素版 (单源最短路径)(O(n^2))

练习

I - Til the Cows Come Home POJ - 2387 (模板)

兔子很热爱学习,为了多学习她希望可以找最快的路线去上学。她的城市里有N个(2 <= N <= 1000)个地铁站,编号分别为1…N。兔子家在1号地铁站旁边,学校是N号地铁站。地铁站之间共有M (1 <= M <= 2000)条双向路径。兔子现在在1号地铁站,她希望知道到学校最短需要多少时间。可以保证兔子能到达学校。忽略换乘地铁的等待时间
Input
第一行:m和n
接下来的m行:每一行有x,y,z三个整数。代表x站到y站或者y站到x站需要z分钟(1<=z<=100)
Output
兔子到学校最少需要多少时间。
Sample Input
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
Sample Output
90
AC代码:
这道题N到1000,直接Floyd肯定超时,感觉与c题差不多,剪枝应该能过,既然这样…就用dijkstra来写⑧

14. Floyd + 朴素版Dijkstra相关推荐

  1. 朴素版Dijkstra算法

    文章目录 一.Dijkstra是什么? 二.使用步骤 1.Dijkstra的基本原理 2.时间复杂度 三.代码实现思路 四.代码实现 总结 一.Dijkstra是什么? Dijkstra算法是由荷兰计 ...

  2. 朴素版dijkstra(稠密图)

    题目: 稠密图只需要用邻接矩阵来存就可以了,两个点之间可能存在重边,由于求最短路只需要把最小的存起来就可以了 初始化: 用dist[]来存储每个点到源点的最短距离,还未被更新过的用INF来表示,若是d ...

  3. PAT甲级1003 Emergency Dijkstra算法(堆优化版/朴素版)

    前言   最近花了很多的时间在写JAVA项目上面,疏忽了算法和数据结构的学习.最近突然醒悟基础更为重要,打算从今天开始每天抽出一些时间做下PAT甲级的题目.现有题库的前两题很简单,从第三题开始吧. 题 ...

  4. 堆优化版dijkstra算法:AcWing 850. Dijkstra求最短路 II

    堆优化版dijkstra算法分析: 朴素版dijkstra的时间复杂度为O(n^2),主要瓶颈在于第1步的寻找全局最小值的过程. 可以用小根堆(C++STL priority_queue)对dist数 ...

  5. 迪杰斯特拉算法(dijkstra)_朴素版_堆优化版

    文章目录 Dijkstra算法 ①朴素版(适用于稠密图) 具体实现 ②堆优化版 具体实现 Dijkstra算法 适用于单源最短路且边权都为正数 例:输入有向图/无向图,输出n号点到1号点的最短距离 ① ...

  6. c++ 堆优化版dijkstra 代码实现

    dijkstra是图论中解决最短路问题的重要算法之一,必须熟练掌握 dijkstra用于解决单源最短路问题,要求图中必须不存在负边权 朴素dijkstra的时间复杂度为O(n^2),堆优化版dijks ...

  7. 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)

    迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...

  8. magicbook大学计算机系,大学生不知道买什么电脑?来看看荣耀MagicBook 14锐龙版!...

    #荣耀原创作者计划# 高考成绩已经陆续发放了,各位准大学生们或许都在为了报考而着急.但是当报考完成之后还有一件迫在眉睫的事情--选购数码装备!在此之前小M已经为各位准大学生推荐了多款手机,今天,咱们就 ...

  9. datetimepicker 时间不更新_iOS 14.2 正式版推送:新增人体检测,这些功能值得更新...

    iOS 14.2 正式版推送:新增人体检测,这些功能值得更新 苹果系统地更新速度现在非常快,距离IOS14走进我们视野不过才不到两个月的时间,而系统版本居然已经更新到了IOS14.2.这一方面可能也从 ...

  10. 苹果新手机软件测试,苹果即将发布iOS 14.5正式版,测试工作已进入最后阶段

    按照苹果的规划,本月他们将会发布iOS 14.5正式版,而目前新系统的测试工作已经进入到最后阶段. 据悉,在iOS和iPadOS 14.5测试版中,苹果隐私设置中的 "位置服务"菜 ...

最新文章

  1. c++深拷贝和浅拷贝
  2. 王飞跃谈GE艰难的数字化转型启示:从工业智联网到工业5.0
  3. Python情感分析:鹿晗的粉丝们究竟原谅他了吗?
  4. 春季每日一题2022 Week 1 【完结】
  5. Windows中常用的git GUI客户端的介绍
  6. GDCM:dicom文件的SHA1测试程序
  7. CString + UINT Error:有多个运算符+=与这些操作数匹配
  8. Openstack Neutron 管理的网络资源
  9. python进阶10 MySQL补充 编码、别名、视图、数据库修改
  10. 带有Gluon Ignite和Dagger的JavaFX中的依赖注入
  11. xcode10 自定义代码块
  12. 详解Python类定义中的各种方法
  13. python-引用/模块
  14. ios中UIView和CALayer关系
  15. 2017的金秋,派卧底去阿里、京东、美团、滴滴带回来的面试题及答案
  16. POJ 3250:Bad Hair Day 好玩的单调栈
  17. 【Flutter小记10】apk 提交各大应用市场,出现armeabi与arm64 版本标识/版本号不一致无法上传审核的解决方案
  18. html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
  19. AutoCAD Civil 3D笔记
  20. 狄利克雷卷积_积性函数和狄利克雷卷积小结

热门文章

  1. RK3288-安卓5.1-AP6212-WIFI模组调试
  2. 老男孩python最新15期课程安排_老男孩Python完美实战课程 14期视频教程 28周Python视频教程 15-25周部分...
  3. html5 js打开新页面,当前页面打开多个新页面的js (很流畅)
  4. STM32F107RBT6移植freeRTOS
  5. 数字孪生:迈向未来,智慧城市大脑运营方案及整体建设解决方针
  6. A*求解带时间窗的路径规划问题
  7. 25B无人直升机调试(Tuning)
  8. linux卸载驱动命令,简单的Linux驱动程序以及如何加载/卸载驱动
  9. 小爱同学音色服务器响应失败,小爱同学获取数据失败怎么回事
  10. npm加速器、github加速器