POJ 3278

每个点可向前、后以及两倍序号的点移动,已知起点终点,求最短路。

 

先构图,每个点最多3个邻点,再做BFS。后来,我把代码优化了一下,把构图省去了,直接加入在BFS中。

 

#include <iostream> #define F(i,a,b) for (int i=a;i<=b;i++) using namespace std; int s, e; int Q[100002], steps[100002]; bool mk[100002]; void bfs() { memset(mk, 0, sizeof(mk) ); Q[0]=s; mk[s]=true; int now=0, last=1; while ( now<last && Q[now]!=e) { int v=Q[now]; if (v+1<=100000 && !mk[v+1]) { mk[v+1]=true; Q[last++]=v+1; steps[v+1]=steps[v]+1; if (v+1==e) return; } if (v-1>=0 && !mk[v-1]) { mk[v-1]=true; Q[last++]=v-1; steps[v-1]=steps[v]+1; if (v-1==e) return ; } if (v!=0 && v*2<=100000 && !mk[v*2]) { mk[v*2]=true; Q[last++]=v*2; steps[v*2]=steps[v]+1; if (v*2==e) return; } now++; } } int main() { //freopen ("in.txt", "r" ,stdin); cin >> s >> e; bfs(); cout << steps[e] <<endl; return 0; }

你可能感兴趣的:(POJ 3278)