题意
起点在N,终点在K。每个点u有三条有向边u–>u-1,u–>u+1,u–>u+u.每条边的权值为1.求N到K的最短路。
解题
一种方法是BFS。以N为根,每个点有三个子节点。因为每条边的权值都是1,所以第一次广度搜索到K的时间就是答案。
另一种解法是最短路。求N到K的单源最短路即可。
AC代码
//93ms 2.9MB
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <string>
using namespace std;
const int maxn=1e5+100;
int d[maxn];
bool vis[maxn];
int N,K;
void spfa()
{
memset(d,0x3f,sizeof(d));
memset(vis,false,sizeof(vis));
vis[N]=true;
d[N]=0;
queue<int> que;
que.push(N);
while(!que.empty())
{
int u=que.front();que.pop();
vis[u]=false;///没有负环的话,vis可以不要
int v;
for(int i=0;i<3;i++)
{
if(i==0) v=u+1;
else if(i==1) v=u-1;
else v=u*2;
if(v<0 || v>=maxn) continue;
if(d[v]>d[u]+1)
{
d[v]=d[u]+1;
if(!vis[v])
{
vis[v]=true;
que.push(v);
}
}
}
}
printf("%d\n",d[K]);
}
int main()
{
while(~scanf("%d%d",&N,&K))
{
spfa();
}
return 0;
}