您的位置:首页 > 其它

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求最短路。

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: