在信息学竞赛中,图论是比较重要的一部分,在有关图论的问题中,搜索占据着很大的份额。典型的有最短路径问题、割边等等,其中最基础的莫过于搜索。

广度优先搜索是最基本的一种方法,在很多算法中都有其思想所在,著名的Dijkstra算法等。其实广度优先搜索就是找出最优路径,相比深度优先搜索其有点就是能给出一个最优的解,而深度搜索只能说明存在一条路径可达,并不保证最优。

来看一题,题目比较长,我给出一个链接有兴趣的读者可自行去看。

http://acm.hdu.edu.cn/showproblem.php?pid=1072

题目的大意就是,在一个相对动态的时间里能否到达指定地点,能的话给出最短时间,不能输出-1。

下面给出源码:

Author:Jeick Jia(贾钰)

Time:2011-4-21

Platform:Linux/G++

#include<cstdio>

#include<queue>

#include<iostream>

using namespace std;

 

struct Point{

int x,y,time,step;

Point():x(0),y(0),time(0),step(0){}

};

const int Max = 10;

int map[Max][Max];

int visit[Max][Max];

int xB,yB,xE,yE;

int row,col,step;

int Go[4][2] = {
{0,1},{0,-1},{1,0},{-1,0}};

bool check(int x,int y)

{

return (x>=0&&x<row)&&(y>=0&&y<col)&&(map[x][y]!=0);

}

void BFS()

{

queue<Point> Que;

visit[xB][yB] = 6;

Point pt;

pt.x = xB;pt.y = yB;

pt.time = 6;pt.step = 0;

Que.push(pt);

while(!Que.empty())

{

Point pnd = Que.front();

Que.pop();

if(pnd.x==xE&&pnd.y==yE&&pnd.time>0)    //arravel at the exit

{

step = pnd.step;return ;

}

for(int i=0;i<4;i++)

{

Point temp;

temp.x = pnd.x+Go[i][0];

temp.y = pnd.y+Go[i][1];

temp.time = pnd.time;

temp.step = pnd.step;

 

if(check(temp.x,temp.y))

{

temp.time–;

temp.step++;

if(temp.time<1) continue;

if(map[temp.x][temp.y]==4) //reset the time

temp.time = 6;

if(temp.time>0&&visit[temp.x][temp.y]<temp.time) //get in the queue

{

visit[temp.x][temp.y] = temp.time;

Que.push(temp);

}

}

}   // end for

}       //end while

return ;

}

int main()

{

int T;

scanf(“%d”,&T);

while(T–)

{

scanf(“%d%d”,&row,&col);

for(int i=0;i<row;i++)

for(int j=0;j<col;j++)

{

scanf(“%d”,&map[i][j]);

if(map[i][j]==2)     //the entrance

{

xB = i;yB = j;

}

else if(map[i][j]==3)

{

xE = i;yE = j; //the exit

}

visit[i][j] = 0;

}

step = -1;

BFS();

printf(“%d\n”,step);

}

return 0;

}

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

前方道路还有很长,我需要不断的前进。