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

题意:有n个城市,编号为(1~n),有一些城市中有一些旅店,要求从一个城市到另一个城市不能超过10小时,问能否从1号城市到n号城市,如果能需要住的最少的旅店数目是多少。

思路:首先将1号城市和n号城市置为有旅店的城市,spfa求每个旅店到其它旅店的最短距离,如果距离小于10小时,将两个旅店之间的权值置为1,这样就能构造出所有旅店之间的图,然后对该图利用floyd求最短路。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <vector>
  6. const int N=;
  7. const int INF=<<;
  8. using namespace std;
  9.  
  10. struct node
  11. {
  12. int v,w;
  13. node(int v,int w):v(v),w(w) {}
  14. };
  15. vector<node>vv[N];
  16. int mp[][],id[N];
  17. int a[N],dis[N];
  18. bool vis[N];
  19. int hotel,n;
  20. void init()
  21. {
  22. memset(id,,sizeof(id));
  23. for (int i = ; i <= hotel+; i++)
  24. {
  25. for (int j = ; j <= hotel+; j++)
  26. {
  27. mp[i][j] = INF;
  28. }
  29. mp[i][i] = ;
  30. }
  31. for (int i = ; i <= n; i++)
  32. vv[i].clear();
  33. }
  34. void spfa(int s)
  35. {
  36. queue<int>q;
  37. memset(vis,,sizeof(vis));
  38. for (int i = ; i <= n; i++)
  39. dis[i] = INF;
  40. dis[s] = ;
  41. q.push(s);
  42. vis[s] = true;
  43. while(!q.empty())
  44. {
  45. int u = q.front();
  46. q.pop();
  47. vis[u] = false;
  48. for (int i = ; i < (int)vv[u].size(); i++)
  49. {
  50. int v = vv[u][i].v;
  51. int w = vv[u][i].w;
  52. if(dis[v]>dis[u]+w)
  53. {
  54. dis[v] = dis[u]+w;
  55. if(!vis[v])
  56. {
  57. q.push(v);
  58. vis[v] = true;
  59. }
  60. }
  61. }
  62. }
  63. for (int i = ; i <= n; i++)
  64. {
  65. if (dis[i]<=)
  66. mp[id[s]][id[i]] = ;
  67. }
  68. }
  69. void floyd()
  70. {
  71. for (int k = ; k <= hotel+; k++)
  72. {
  73. for (int i = ; i <= hotel+; i++)
  74. {
  75. for (int j = ; j <= hotel+; j++)
  76. if(mp[i][j] > mp[i][k]+mp[k][j])
  77. mp[i][j] = mp[i][k]+mp[k][j];
  78. }
  79. }
  80. }
  81. int main()
  82. {
  83. while(scanf("%d",&n)&&n)
  84. {
  85. scanf("%d",&hotel);
  86. init();
  87. for (int i = ; i <= hotel; i++)
  88. {
  89. scanf("%d",&a[i]);
  90. id[a[i]] = i;
  91. }
  92. a[] = ;
  93. a[hotel+] = n;
  94. id[] = ;
  95. id[n] = hotel+;
  96. int m,u,v,w;
  97. scanf("%d",&m);
  98. for (int i = ; i <= m; i++)
  99. {
  100. scanf("%d%d%d",&u,&v,&w);
  101. vv[u].push_back(node(v,w));
  102. vv[v].push_back(node(u,w));
  103. }
  104. for (int i = ; i <= hotel; i++)
  105. spfa(a[i]);
  106. floyd();
  107. if (mp[][hotel+]>=INF)
  108. puts("-1");
  109. else
  110. printf("%d\n",mp[][hotel+]-);
  111. }
  112. return ;
  113. }

Hotel booking(spfa+floyd)的更多相关文章

  1. HDU 2992 Hotel booking(BFS+DFS 或者 SPFA+Floyd)

    点我看题目 题意 : 一个司机要从1点到达n点,1点到n点中有一些点有宾馆,司机的最长开车时间不能超过10小时,所以要在10小时之内找到宾馆休息,但是为了尽快的走到n点,问最少可以经过几个宾馆. 思路 ...

  2. PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)

    题目大意:原题链接 给你一张图,初始你在房间1,初始生命值为100,进入每个房间会加上那个房间的生命(可能为负),问是否能到达房间n.(要求进入每个房间后生命值都大于0) 解题思路: 解法一:Floy ...

  3. 最短路算法详解(Dijkstra/SPFA/Floyd)

    新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...

  4. hdu 1874 畅通工程续(模板题 spfa floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...

  5. POJ 1502 MPI Maelstrom( Spfa, Floyd, Dijkstra)

    题目大意: 给你 1到n ,  n个计算机进行数据传输, 问从1为起点传输到所有点的最短时间是多少, 其实就是算 1 到所有点的时间中最长的那个点. 然后是数据 给你一个n 代表有n个点, 然后给你一 ...

  6. hdu 2992 Hotel booking

    http://acm.hdu.edu.cn/showproblem.php?pid=2992 #include <cstdio> #include <cstring> #inc ...

  7. 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim

    1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...

  8. 四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)

    什么是最短路径问题? 简单来讲,就是用于计算一个节点到其他所有节点的最短路径. 单源最短路算法:已知起点,求到达其他点的最短路径. 常用算法:Dijkstra算法.Bellman-ford算法.SPF ...

  9. POJ 1932 XYZZY (ZOJ 1935)SPFA+floyd

    http://poj.org/problem?id=1932 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1935 题目大 ...

随机推荐

  1. linux vim 常用操作

    vim 字符级 上k下j左h右i,键盘的方向键也可以移动 单词级 b上个单词首字母 w下个单词首字母 e下个单词的尾字母 行级 0行首 $行尾 删除 dd 删除光标所在行 文档级 gg 文档首行,首个 ...

  2. 利用gsoap库封装易用的rest框架

    c++缺少web开发的框架,web框架分为异步和同步,异步的业务逻辑控制需要较强功底,同步代码实现起来容易,利于阅读理解 1.gsoap是c++写的webservice库,webservice应用层也 ...

  3. Django-REST-Framework JWT 实现SSO认证(上)

    一.什么是Django-REST-Framework? Django-REST-framework 是基于Django框架的一个web RESTful风格开发的框架,它可以实现API接口的快速开发,但 ...

  4. python3虚拟环境应用

    python3自带虚拟环境venv,大致操作只有三步 1. 创建虚拟环境 python3 -m venv venv(名称随意) 2. 激活虚拟环境 source venv/bin/activate 3 ...

  5. [linux]centos7下解决yum install mysql-server没有可用包

    第一步:安装从网上下载文件的wget命令 [root@master ~]# yum -y install wget 第二步:下载mysql的repo源 [root@master ~]# wget ht ...

  6. codevs1197 Vigenère密码

    题目描述 Description 16 世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère 密码的加密解密算法简单易用,且破译难度比 ...

  7. DJANGO中如何用邮箱来登陆?

    就是另一个不同的登陆backend. 而DJANGO会尝不同的方式,哪个成功就用哪个 authentication.py from django.contrib.auth.models import ...

  8. [poj1678]I Love this Game!_博弈论

    I Love this Game! 题目大意:题目链接 注释:略. 想法: 开始的时候以为没法dp,结果...:a>0啊! 所以可以直接dp了啊! 状态:dp[i]表示先手选了a[i]的状态. ...

  9. springmvc 日期转换器

    package com.xxx.common.controller.converter; import org.joda.time.DateTime; import org.joda.time.for ...

  10. centos 7: 迁移MySQL目录

    Steps: 1. systemctl stop mariadb 2. mkdir data destination folder, ex: /home/mysql 3. cp -R /var/lib ...