/*
* =====================================================================================
*
* Filename: dfs.c
*
* Description: dfs 深度优先搜索,bfs 广义优先搜索
*
* Version: 1.0
* Created: 2010年10月27日 22时08分27秒
* Revision: none
* Compiler: gcc
*
* Author: Yang Shao Kun (), cdutyangshaokun@163.com
* Company: College of Information Engineering of CDUT
*
* =====================================================================================
*/
深度优先搜索:重图的概念引发出来的。
我们从图中的某一个起始点v开始,访问他的任何一个邻接点w,然后
在从w出发,访问w的邻接点(没有访问过的)w2,然后在从w2开始,进
行类似的访问,直到所用的邻接点都被访问后为止。接着,退回一步,
退到前一次刚被访问的节点,看,它还有没有没有被访问的邻接点。重
复以上步骤,直到所有的顶点都被访问后结束。
算法实现:
void dfs(algraph *g,int v)
{
arcnode *p;
visited[v]=1;/*置已经访问标记*/
printf("%d ",v);/* 输出被访问的节点编号*/
p=g->adjlist[v].firstarc;/*p指向顶点v的第一条连线的结点*/
while(p!=NULL)
{
if(visted[p->adjvex]==0)/*若节点p->adjvex没有访问,递归访问它*/
dfs(g,p->adjvex);
p=p->nextarc;
}
}
用到的数据结构有:
typedef struct {
Adjlist adjlist;/*邻接表*/
int n,e;/*图中顶点数和边数*/
}algraph;/*图的类型*/
typedef struct Vnode{
int data;/*int可以更换*/
arcnode *firstarc;/*指向第一条弧*/
}vnode;
typedef vnode adjlist[max];/*adjlist 是邻接表型*/
typedef struct anode{
int adjvex;/*该弧点的终点位置*/
struct anode *nextarc;/*指向下一条弧的指针*/
}arcnode
回溯:在探索问题的时候走进了死胡同,则需要退回来,重例外的一条路开始。
广度优先搜索:首先访问初始点v1,接着访问v1的所有未访问过的领结点,v2,v3,,,,vt,然后在按照v1,,,vt的次序,访问每一个顶点的所有未被访问的邻接点,直到所有的顶点都被访问后结束。
所以,这个数据结构类似于------队列。
void bfs(algraph *g,int v)
{
arcnode *p;
int queue[max],front=0,rear=0;/*定义循环队列并初始化*/
int visited[max];/*定义存放结点的访问标志的数组*/
int w,i;
for(i=0;i<g->n;i++)
visited[i]=0;/*访问标志数组初始化*/
printf("%d",v);
visited[v]=1;
rear=(rear+1)%max;
queue[rear]=v;/*v进队*/
while(front!=rear)
{
front=(front+1)%max;
w=queue[front];
p=g->adjlist[w].firstarc;/*找与顶点w邻接的第一个顶点*/
while(p!=NULL)
{
if(visted[p->adjvex]==0)/*如果当前的节点没有被访问*/
{
printf("%d",p->adjvex);/*访问当前的节点*/
visited[p->adjvex]=1;/*置该顶点已被访问标志*/
rear=(rear+1)%max;/*该顶点进队*/
queue[rear]=p->adjvex;
}
p=p->nextarc;/*找下一个邻接顶点*/
}
}
printf("\n");
}
广度优先搜索能找到最短的路径。