1. 程式人生 > >POJ 3278 解題報告

POJ 3278 解題報告

這道題是個BFS的問題,因為要求的是一個相鄰節點間距離都為1的graph中兩個節點間的最短距離。一開始上來用的DFS,結果可想而知。

3278 Accepted 844K 63MS G++ 1192B

/* 
ID: thestor1 
LANG: C++ 
TASK: poj3278 
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>

using namespace std;
std::vector<bool> visited(150000, false);

int main()
{
	int N, K;
	cin >> N >> K;
	if (K <= N)
	{
		cout << N - K << endl;
	}
	else
	{
		queue<int> que;
		que.push(N);
		visited[N] = true;
		int step = 0;

		while (!que.empty())
		{
			int size = que.size();
			for (int i = 0; i < size; ++i)
			{
				int cur = que.front();
				que.pop();
				if (cur == K)
				{
					cout << step << endl;
					return 0;
				}
				if (cur - 1 >= 0 && !visited[cur - 1])
				{
					que.push(cur - 1);
					visited[cur - 1] = true;	
				}
				if (cur + 1 < 150000 && !visited[cur + 1])
				{
					que.push(cur + 1);
					visited[cur + 1] = true;
				}
				if (2 * cur < 150000 && !visited[2 * cur])
				{
					que.push(2 * cur);
					visited[2 * cur] = true;	
				}
			}
			step++;
		}
	}
	return 0;
}