http://acm.hdu.edu.cn/showproblem.php?pid=2066

今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以为这是Dijkstra---我居然一直把两个算法

记的是混的,还居然一直没有被别人发现,真是个大乌龙

好了,看看这道题,赤裸裸的最短路水题,首先来个Floyd的,把城市看成点,将连通的的点赋值为给定的时间,未连通的赋值为很大,这是个无向的关系

然后就是三个循环,以一个点为媒介,把每个点遍历一遍,比较找出点连通的最小值就行,稍微优化一点点就不会超时了

code

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define inf 1000000005
  4. using namespace std;
  5. int mp[][],q[];
  6. void jjc()
  7. {
  8. int i,j;
  9. for (i=;i<=;i++){
  10. for (j=;j<=;j++){
  11. if (i==j) mp[i][j]=;
  12. else mp[i][j]=inf;
  13. }
  14. }
  15. }
  16. int min(int x,int y){
  17. if (x<y) return x;
  18. else return y;
  19. }
  20. int main()
  21. {
  22. int t,s,d,c,i,j,k,w,mx,a,b,mn;
  23. while (~scanf("%d %d %d",&t,&s,&d))
  24. {
  25. jjc();
  26. mx=;mn=inf;
  27. while (t--)
  28. {
  29. scanf("%d %d %d",&a,&b,&c);
  30. if (mp[a][b]>c)
  31. mp[a][b]=mp[b][a]=c;
  32. if (a>mx) mx=a; 没有给定范围,所以找范围
  33. if (b>mx) mx=b;
  34. if (a<mn) mn=a;
  35. if (b<mn) mn=b;
  36. }
  37. for (k=mn;k<=mx;k++){
  38. for (i=mn;i<=mx;i++){
  39. if (mp[i][k]>=inf) continue; //稍微优化一点点
  40. for (j=mn;j<=mx;j++){
  41. mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
  42. }
  43. }
  44. }
  45. for (i=;i<=s;i++)
  46. scanf("%d",&q[i]);
  47. int ans=inf;
  48. while (d--)
  49. {
  50. scanf("%d",&w);
  51. for (i=;i<=s;i++)
  52. {
  53. if (mp[q[i]][w]<ans)
  54. ans=mp[q[i]][w];
  55. }
  56. }
  57. printf("%d\n",ans);
  58. }
  59. return ;
  60. }

然后是Dijkstra的, Floyd是把任意两点的最短距离都求了出来,而Dijkstra只是求了特定的起点与所有点之间的最短路,一般情况而言,后者要快于前者,具体用哪种根据题目而定

按照距离从小到大的顺序,找出从给定起点能够到达的下一点,每找到一个这样的点,然后更新其余点之间的距离

code

  1. #include<cstdio>
  2. #define inf 100000005
  3. using namespace std;
  4. int map[][],vis[],dis[];
  5. int st[],sr[];
  6. int mn,mx;
  7. int min(int x,int y)
  8. {
  9. if (x<y) return x;
  10. else return y;
  11. }
  12. void jjc()
  13. {
  14. int i,j;
  15. for (i=;i<=;i++){
  16. for (j=;j<=;j++){
  17. if (i==j) map[i][j]=;
  18. else map[i][j]=inf;
  19. }
  20. }
  21. }
  22. void dijkstra(int x)
  23. {
  24. int i,pos,j,q;
  25. for (i=mn;i<=mx;i++)
  26. {
  27. dis[i]=map[x][i];
  28. vis[i]=;
  29. }
  30. vis[x]=;
  31. for (i=mn;i<=mx;i++)
  32. {
  33. q=inf;pos=x;
  34. for (j=mn;j<=mx;j++)
  35. if (!vis[j]&&dis[j]<q)
  36. {
  37. pos=j;
  38. q=dis[j];
  39. }
  40. vis[pos]=;
  41. for (j=mn;j<=mx;j++)
  42. dis[j]=min(dis[j],dis[pos]+map[pos][j]);
  43. }
  44. }
  45. int main()
  46. {
  47. int t,s,d,a,b,c,i,j;
  48. while (~scanf("%d %d %d",&t,&s,&d))
  49. {
  50. jjc();
  51. mx=,mn=inf;
  52. while (t--)
  53. {
  54. scanf("%d %d %d",&a,&b,&c);
  55. if (map[a][b]>c)
  56. map[a][b]=map[b][a]=c;
  57. if (a>mx) mx=a;
  58. if (b>mx) mx=b;
  59. if (a<mn) mn=a;
  60. if (b<mn) mn=b;
  61. }
  62. for (i=;i<=s;i++)
  63. scanf("%d",&st[i]);
  64. for (i=;i<=d;i++)
  65. scanf("%d",&sr[i]);
  66. int ans=inf;
  67. for (i=;i<=s;i++)
  68. {
  69. dijkstra(st[i]);
  70. for (j=;j<=d;j++)
  71. if (dis[sr[j]]<ans)
  72. ans=dis[sr[j]];
  73. }
  74. printf("%d\n",ans);
  75. }
  76. return ;
  77. }

队列储存,广搜版的spfa

code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #define inf 0x3fffffff
  5. using namespace std;
  6. int map[][],vis[],dis[];
  7. int st[],sr[];
  8. int mn,mx,s,d;
  9. void jjc()
  10. {
  11. int i,j;
  12. for (i=;i<=;i++){
  13. for (j=;j<=;j++){
  14. if (i==j) map[i][j]=;
  15. else map[i][j]=inf;
  16. }
  17. }
  18. }
  19. int spfa()
  20. {
  21. int num,i;
  22. memset(vis,,sizeof(vis));
  23. for (i=mn;i<=mx;i++)
  24. dis[i]=inf;
  25. queue<int> q;
  26. for (i=;i<=s;i++)
  27. {
  28. dis[st[i]]=;
  29. q.push(st[i]);
  30. }
  31. while(!q.empty())
  32. {
  33. num=q.front();
  34. q.pop();
  35. vis[num]=;
  36. for (i=mn;i<=mx;i++)
  37. {
  38. if (dis[i]>dis[num]+map[num][i])
  39. {
  40. dis[i]=dis[num]+map[num][i];
  41. if (vis[i]==)
  42. {
  43. vis[i]=;
  44. q.push(i);
  45. }
  46. }
  47. }
  48. }
  49. int p=inf;
  50. for (i=;i<=d;i++)
  51. {
  52. if (p>dis[sr[i]]) p=dis[sr[i]];
  53. }
  54. return p;
  55. }
  56. int main()
  57. {
  58. int t,a,b,c,i,j;
  59. while (~scanf("%d %d %d",&t,&s,&d))
  60. {
  61. jjc();
  62. mx=,mn=inf;
  63. while (t--)
  64. {
  65. scanf("%d %d %d",&a,&b,&c);
  66. if (map[a][b]>c)
  67. map[a][b]=map[b][a]=c;
  68. if (a>mx) mx=a;
  69. if (b>mx) mx=b;
  70. if (a<mn) mn=a;
  71. if (b<mn) mn=b;
  72. }
  73. for (i=;i<=s;i++)
  74. scanf("%d",&st[i]);
  75. for (i=;i<=d;i++)
  76. scanf("%d",&sr[i]);
  77. int ans=spfa();
  78. printf("%d\n",ans);
  79. }
  80. return ;
  81. }

hdu 2066 ( 最短路) Floyd & Dijkstra & Spfa的更多相关文章

  1. HDU 2066 最短路floyd算法+优化

    http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...

  2. 最短路(floyd/dijkstra/bellmanford/spaf 模板)

    floyd/dijkstra/bellmanford/spaf 模板: 1. floyd(不能处理负权环,时间复杂度为O(n^3), 空间复杂度为O(n^2)) floyd算法的本质是dp,用dp[k ...

  3. HDU - 2544最短路 (dijkstra算法)

    HDU - 2544最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以 ...

  4. HDu 2544 最短路【dijkstra &amp; floyed &amp; SPFA 】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. hdu 2544 最短路 (dijkstra,floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) #include < ...

  6. 最短路问题 Floyd+Dijkstra+SPFA

    参考博客:https://blog.csdn.net/qq_35644234/article/details/60875818 题目来源:http://acm.hdu.edu.cn/showprobl ...

  7. HDU Today HDU杭电2112【Dijkstra || SPFA】

    http://acm.hdu.edu.cn/showproblem.php?pid=2112 Problem Description 经过锦囊相助,海东集团最终度过了危机,从此.HDU的发展就一直顺风 ...

  8. find the safest road HDU杭电1596【Dijkstra || SPFA】

    pid=1596">http://acm.hdu.edu.cn/showproblem.php?pid=1596 Problem Description XX星球有非常多城市,每一个城 ...

  9. HDU 2544 最短路 【Dijkstra模板题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路:最短路的模板题 Dijkstra 算法是一种类似于贪心的算法,步骤如下: 1.当到一个点时, ...

随机推荐

  1. Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件mysql数据库,版本5.7 ...

  2. 用python来分割图片

    程序思路: 此次程序主要是利用PIL(Python Image Libraty)这库,来进行图片的处理.PIL是一个功能非常强大的python图像处理标准库,但由于PIL只支持python2.7.如今 ...

  3. 下载安装windows版Redis

    链接       https://github.com/MicrosoftArchive/redis/releases 选择版本下载 在redis目录打开cmd命令输入 redis-server.ex ...

  4. Integer 原码解读

    有一天,突然发现,阅读原码可以发现很多有趣的东西.在Java中,我们知道很多东西都是封装好的,拿来即用,当你有一天去研究它拿来的东西是如何具体操作的,将会是非常有趣的事情. 在上一篇研究HashMap ...

  5. Python基础之Python分类

    python环境 编译型: 一次性将所有程序编译成二级制文件,开发效率极低,因为一旦出现BUG所有的程序需要全部重新编译 缺点: 开发效率低,不能跨平台 优点: 执行速度快 解释型: 当程序执行时,一 ...

  6. oracle授予调用存储过程权限

    参考 https://blog.csdn.net/h254532693/article/details/45364317 grant execute on PROCEDURENAME to USERN ...

  7. java根据wsdl调用webservice

    本方法参考 Java核心技术 卷二 (第八版) 中10.6.2节相关内容,特与大家分享,欢迎大家批评指教 <a href="http://www.webxml.com.cn/" ...

  8. 【Nodejs】Node.js(Express)の環境構築

    [Express]の環境 参考URL:http://expressjs.com/en/starter/generator.html ①Node.jsの準備 (参考URL:https://www.cnb ...

  9. php71

    yum -y install php-mcrypt libmcrypt libmcrypt-devel autoconf freetype gd jpegsrc libmcrypt libpng li ...

  10. 每月IT摘录201812

    技术 1.JVM.Java并发.NIO.网络通信,这些都是一个java工程师必须具备底层技术素养. 2.关于技术广度.消息中间件.分布式缓存.海量数据.分布式搜索.NoSQL.分布式架构.高并发.高可 ...