Hotel booking(spfa+floyd)
2014-03-30 00:15
363 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2992
题意:有n个城市,编号为(1~n),有一些城市中有一些旅店,要求从一个城市到另一个城市不能超过10小时,问能否从1号城市到n号城市,如果能需要住的最少的旅店数目是多少。
思路:首先将1号城市和n号城市置为有旅店的城市,spfa求每个旅店到其它旅店的最短距离,如果距离小于10小时,将两个旅店之间的权值置为1,这样就能构造出所有旅店之间的图,然后对该图利用floyd求最短路。
View Code
题意:有n个城市,编号为(1~n),有一些城市中有一些旅店,要求从一个城市到另一个城市不能超过10小时,问能否从1号城市到n号城市,如果能需要住的最少的旅店数目是多少。
思路:首先将1号城市和n号城市置为有旅店的城市,spfa求每个旅店到其它旅店的最短距离,如果距离小于10小时,将两个旅店之间的权值置为1,这样就能构造出所有旅店之间的图,然后对该图利用floyd求最短路。
#include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <vector> const int N=10005; const int INF=1<<28; using namespace std; struct node { int v,w; node(int v,int w):v(v),w(w) {} }; vector<node>vv ; int mp[120][120],id ; int a ,dis ; bool vis ; int hotel,n; void init() { memset(id,0,sizeof(id)); for (int i = 0; i <= hotel+2; i++) { for (int j = 0; j <= hotel+2; j++) { mp[i][j] = INF; } mp[i][i] = 0; } for (int i = 0; i <= n; i++) vv[i].clear(); } void spfa(int s) { queue<int>q; memset(vis,0,sizeof(vis)); for (int i = 0; i <= n; i++) dis[i] = INF; dis[s] = 0; q.push(s); vis[s] = true; while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; for (int i = 0; i < (int)vv[u].size(); i++) { int v = vv[u][i].v; int w = vv[u][i].w; if(dis[v]>dis[u]+w) { dis[v] = dis[u]+w; if(!vis[v]) { q.push(v); vis[v] = true; } } } } for (int i = 1; i <= n; i++) { if (dis[i]<=600) mp[id[s]][id[i]] = 1; } } void floyd() { for (int k = 0; k <= hotel+1; k++) { for (int i = 0; i <= hotel+1; i++) { for (int j = 0; j <= hotel+1; j++) if(mp[i][j] > mp[i][k]+mp[k][j]) mp[i][j] = mp[i][k]+mp[k][j]; } } } int main() { while(scanf("%d",&n)&&n) { scanf("%d",&hotel); init(); for (int i = 1; i <= hotel; i++) { scanf("%d",&a[i]); id[a[i]] = i; } a[0] = 1; a[hotel+1] = n; id[1] = 0; id = hotel+1; int m,u,v,w; scanf("%d",&m); for (int i = 1; i <= m; i++) { scanf("%d%d%d",&u,&v,&w); vv[u].push_back(node(v,w)); vv[v].push_back(node(u,w)); } for (int i = 0; i <= hotel; i++) spfa(a[i]); floyd(); if (mp[0][hotel+1]>=INF) puts("-1"); else printf("%d\n",mp[0][hotel+1]-1); } return 0; }
View Code
相关文章推荐
- HDU 2992 Hotel booking(spfa+floyd)
- HDU 2922 Hotel booking(SPFA+floyd+map)
- HDU 2992 Hotel booking(BFS+DFS 或者 SPFA+Floyd)
- 【HDU 2992 Hotel booking】spfa+floyd+map映射
- hdu 2992 Hotel booking(spfa+floyd+map)
- hdu2992 Hotel booking (floyd+spfa+map)
- 蒟蒻的图论总结(2):用Floyd、Dij.和SPFA解决最短路
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 最短路径算法总结(Floyd,bellmen-ford,dijkstra,Spfa)
- Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- HDU 1317(Floyd判断连通性+spfa判断正环)
- hdu 1874 畅通工程续(模板题 spfa floyd)
- 图的最短路径:Dijkstra、Bellman-Ford、SPFA、Floyd、A*算法
- 四种最短路径算法(Dijkstra,Floyd,Bellman-ford&&spfa)
- 最短路模板[spfa][dijkstra+堆优化][floyd]
- [面试] BFS、Dijstra、SPFA、Floyd求最短路的比较
- POJ 1502 MPI Maelstrom( Spfa, Floyd, Dijkstra)
- poj 1847 Tram 【最短路 dijkstra + floyd + spfa】