奇怪的电梯——看上去搜索,实际上可以直接最短路

  一眼望去,本来也是用的bfs,但是后来发现了是最短路。因为我打bfs 的时候想到要不要用vis 数组,就脑中模拟了一下如果访问过一层楼的话会不会有更优的情况会再次经过一次,然后想到似乎如果会再次经过的话就代表着搜索时走过了一个若干楼层构成的环,想到环就想到了最短路,最后就是这个代码。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 using namespace std;
 5 const int N=512;
 6 int n,x,y,val[N];
 7 vector<int> gr[N];
 8 int dij(int sx,int tx){
 9     int dis[N];
10     bool vis[N];
11     for(int i=0;i<=n;i++)
12         if(i==sx)dis[i]=0,vis[i]=true;
13         else vis[i]=false,dis[i]=N;
14     for(int i=0;i<gr[sx].size();i++)dis[gr[sx][i]]=1;
15     for(int i=1;i<n;i++){
16         int u=0,v=N;
17         for(int j=1;j<=n;j++)
18             if(!vis[j]&&dis[j]<v)
19                 v=dis[j],u=j;
20         vis[u]=true;
21         for(int j=0;j<gr[u].size();j++)
22             if(!vis[gr[u][j]]&&dis[gr[u][j]]>dis[u]+1)
23                 dis[gr[u][j]]=dis[u]+1;
24     }
25     return (dis[tx]!=N?dis[tx]:-1);
26 }
27 int main(){
28     cin>>n>>x>>y;
29     for(int i=1;i<=n;i++)cin>>val[i];
30     for(int i=1;i<=n;i++){
31         if(i+val[i]<=n)gr[i].push_back(i+val[i]);
32         if(i-val[i]>=1)gr[i].push_back(i-val[i]);
33     }
34     cout<<dij(x,y)<<endl;
35     return 0;
36 }

Method_01

  洛谷 0ms

时间: 2024-10-02 07:59:31

奇怪的电梯——看上去搜索,实际上可以直接最短路的相关文章

P1135 奇怪的电梯

P1135 奇怪的电梯 题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始.在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮呢? 输入输出格

【Luogu P1135】 奇怪的电梯

题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,--),从一楼开始.在一楼,按"上"可以到4楼,按"下"是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮

TYVJ P3522 &amp;&amp;洛谷 P1135 奇怪的电梯 Label:bfs

题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始.在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮呢? 输入输出格式 输入格式: 输入文件

奇怪的电梯//错误代码!!!!20分

§奇怪的电梯(lift.cpp) §[问题描述] §大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始.在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮呢? §[输入格式]lift.in §输入文件共

奇怪的电梯

1078. 奇怪的电梯 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,--),从一楼开始.在一楼,按"上"可以到4楼,按"下

【bfs】奇怪的电梯(P1135)

题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,--),从一楼开始.在一楼,按"上"可以到4楼,按"下"是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮

洛谷 P1135 奇怪的电梯

P1135 奇怪的电梯 spfa 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000 4 #define inf 1<<30 5 int n,m,x,y,z,num,head[maxn],dis[maxn],a,b; 6 struct Edge{ 7 int u,v,d,next; 8 }edge[maxn]; 9 char ch; 10 inline void read(int &

【DFS】奇怪的电梯

奇怪的电梯 题目描述 有一天桐桐做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K:(0≤Ki≤N).电梯只有四 个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始.在一楼,按“上,”可以到4楼,按“下”是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮 呢? 输入 第1行为三个正整数,表示N,A,B(

洛谷 P1135 奇怪的电梯x (dfs)

题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如:3 3 1 2 5代表了Ki(K1=3,K2=3,--),从一楼开始.在一楼,按"上"可以到4楼,按"下"是不起作用的,因为没有-2楼.那么,从A楼到B楼至少要按几次按钮