1. 程式人生 > >CodeForces 689B(BFS_B題)解題報告

CodeForces 689B(BFS_B題)解題報告

play i++ pan 之前 最短路 alt 技術 bsp 可能性

題目鏈接:http://codeforces.com/problemset/problem/689/B

--------------------------------------------------------------------------------

題意:在一條直線上有n個城市,相鄰兩個城市之間的花費為1,但是有捷徑,可以到捷徑所在的點,而且只需要1的花費,捷徑不能前往之前的城市。

思路:經典的,bfs打板直接過。唯一要註意的是這種情況,如4-7有捷徑,所以有可能到6的最短路徑為4-7-6。註意判斷捷徑之後往回走的可能性。第一次沒註意,WA了一發~~~

代碼:

技術分享圖片
#include<cstdio>
#include
<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using
namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN =2e5+10; const int INF = 1e9; int a[MAXN]; int dis[MAXN]; int n =0; void bfs(){ queue<int> q; q.push(1); while(!q.empty()){ int cur =q.front(); q.pop();
if(cur<n&&dis[cur+1]>dis[cur]+1){ dis[cur+1]=dis[cur]+1; q.push(cur+1); }if(dis[a[cur]]>dis[cur]+1&&a[cur]>cur){ dis[a[cur]]=dis[cur]+1; q.push(a[cur]); }if(cur>1&&cur<=n&&dis[cur-1]>dis[cur]+1){ dis[cur-1]=dis[cur]+1; q.push(cur-1); } } } int main(void){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); dis[i] = INF; } dis[1]=0; bfs(); for(int i=1;i<=n;i++){ printf("%d ",dis[i]); } printf("\n"); return 0; }
View Code

CodeForces 689B(BFS_B題)解題報告