您的位置:首页 > 运维架构

bzoj 3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四(set+BFS)

2018-03-01 01:33 513 查看

3383: [Usaco2004 Open]Cave Cows 4 洞穴里的牛之四

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 44  Solved: 26
[Submit][Status][Discuss]

Description

    一道竖直的石墙横在贝茜前面,她必须越过去.    石墙可以看成一个xz平面,贝茜开始的时候在(0,0),只要她到达z=T(1≤T≤200000)的位置,就算翻越成功.    墙上有N(1≤N≤50000)块石头突出,成为贝茜的落蹄石.如果两个落蹄石之间z方向和名方向的距离均不超过2,那贝茜就可以之它们之间攀越. 帮助贝茜计算她是否能够翻越石墙,如果可以,最少需要踩多少块落蹄石.

Input

    第1行输入N和T;接下来N行,每行输入坐标(x,z),表示一个石头的位置.其中x∈[0,10^6],z∈[0,T],(0,0)不会出现.

Output

    如果可以翻越则输出最少需要的落蹄石数(起点不计入),否则输出-1.

Sample Input

5 31 26 34 13 20 2

Sample Output

4

是一个很简单的最短路,如果从A石头能跳到B石头,那么A到B连一条边
但是石头特别多不能暴力,所以可以每个x竖线上的点用set存一下,广搜时对于能到达的点在set里面查

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<set>
#include<queue>
using namespace std;
typedef struct Res
{
int x, y, id;
bool operator < (const Res &b) const
{
if(y<b.y)
return 1;
return 0;
}
}Res;
Res s[50005], now, temp;
set<Res> st[1000005];
queue<Res> q;
int dp[50005];
int main(void)
{
int n, h, i, ans;
set<Res>::iterator it;
scanf("%d%d", &n, &h);
for(i=1;i<=n;i++)
{
scanf("%d%d", &s[i].x, &s[i].y);
s[i].id = i;
st[s[i].x].insert(s[i]);
}
memset(dp, 62, sizeof(dp));
dp[0] = 0;
now.x = now.y = now.id = 0;
q.push(now);
while(q.empty()==0)
{
now = q.front();
now.y -= 2;
q.pop();
for(i=max(now.x-2, 0);i<=min(now.x+2, 1000000);i++)
{
for(it = st[i].lower_bound(now);it!=st[i].end() && (*it).y<=now.y+4;it++)
{
temp = *it;
if(dp[now.id]+1<dp[temp.id])
{
dp[temp.id] = dp[now.id]+1;
q.push(temp);
}
}
}
}
ans = 2147483647;
for(i=1;i<=n;i++)
{
if(s[i].y>=h)
ans = min(ans, dp[i]);
}
if(ans<=n)
printf("%d\n", ans);
else
printf("-1\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: