您的位置:首页 > 理论基础 > 数据结构算法

数据结构之图的遍历(BFS+DFS)

2017-08-07 22:04 197 查看
//定义全局变量

const int Maxnum=50;
typedef int AdjMatrix[Maxnum][Maxnum];//定义边数组结构
typedef Struct
{
int vexnum,arcnum;//顶点数、边数
AdjMatrix arcs;//边数组
}Graph;//图

bool visited[Maxnum];//标记是否访问的数组


//DFS:时间复杂度O(n*n)

//相当于树遍历中的前序遍历

//适合寻找目标明确,以找到目标为目的的情况

void DFS(Graph &g, int v)
{
visited[v]=true;//从V开始访问,flag它
printf("%d",v);//打印v
for(int j=0;j<g.vex.num;j++)
{
if(arcs[v][j]==1 && visited[j]==false)//这里可以获得V未访问过的邻接点
DFS(g,j);//递归调用,如果所有节点都被访问过,就回溯,而不再调用这里的DFS
}
}
void DFSTraverse(Graph &g)
{
for(int i=0;i<g.vexnum;i++)//初始化访问数组
visited[i]=false;

for(int i=0;i<g.vexnum;i++)
{
if(visited[i]==false)//从没有访问过的第一个元素来遍历图
DFS(g,i);
}
}


//BFS:时间复杂度O(n*n)

//相当于树遍历中的层次遍历

//适合在不断扩大遍历范围时找到相对最优解的情况

void(Graph &g)
{
for(int i=0;i<g.vexnum;i++)//初始化访问数组
visited[i]=false;
queue<int> Q;
for(int i=0;i<g.vexnum;i++)
{
if(visited[i]==false)//若该点没有访问
{
visited[i]=true;//标记该点
Q.push(i);//将该点加入队列
while(!Q.empty())//只要队列不空,遍历就没有结束
{
int t=Q.front();//取出队头元素
printf("%d",t);//打印t
Q.pop();
for(int j=0;j<g.vexnum;j++)
{
if(arcs[t][j]==1 && visited[j]==false)//将其未访问过的邻接点加进入队列
{
visited[j]==true;//在这里要设置true,因为这里该顶点我们已经加入到了队列,为了防止重复加入!
Q.push(j);
}
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: