1. 深度优先遍历
int visit[maxSize];
/*v是起点编号,visit[]是一个全局数组,作为顶点的访问标记,初始时所有元素均为0
表示所有顶点都未被访问*/
void DFS(AGraph *G,int v)
{
ArcNode *p; //边结点
visit[v]=1; //置已访问标记
Visit(v);
p = G->adjlist[v].firstarc;
while(p != NULL)
{
if(visit[p->adjvex] == 0) //若顶点未访问,则递归访问它
DFS(G,p->adjvex);
p = p->nextarc; //p指向顶点v的下一条边的
}
}
2. 广度优先搜索
void BFS(AGraph *G,int v,int visit[maxSize]) //visit[]数组被初始化全为0
{
ArcNode *p; //边结点
int que[maxSize],front=-1,rear=-1;
int j;
Visit(v);
visit[v] = 1;
rear = (rear+1)%maxSize; //当前顶点v进队
que[rear] = v;
while(front != rear) //队空的时候说明遍历完成
{
front = (front+1)%maxSize; //顶点出队
j = que[front];
p = G->adjlist[j].firstarc; //p指向出队顶点j的第一条边
while(p != NULL)
{
if(visit[p->adjvex] == 0) //当前邻接顶点未被访问,则进队
{
Visit(p->adjvex);
visit[p->adjvex] = 1;
rear = (rear+1)%maxSize;
que[rear] = p->adjvex;
}
p = p->nextarc; //p指向j的下一条边
}
}
}
3. 拓扑排序
typedef struct
{
char data;
int count; //count用来统计顶点当前的入度
ArcNode *firstarc;
}
int TopSort(AGraph *G)
{
int i,j,n=0;
int stack[maxSize],top=-1; //定义并初始化栈
ArcNode *p; //边结点
//这个循环将图中入度为0的顶点入栈
for(i=0;i<G->n;++i)
if(G->adjlist[i].count == 0)
stack[++top] = i;
while(top != -1)
{
i = stack[top--]; //顶点出栈
++n; //计数器加1,统计当前顶点
printf("%d",i); //输出当前顶点
p = G->adjlist[i].firstarc;
//这个循环实现了将所有由此顶点引出的边所指向的顶点的入度减1,
//并将这个过程中入度为0的顶点入栈
while(p != NULL)
{
j = p->adjvex;
--(G->adjlist[j].count);
if(G->adjlist[j].count == 0)
stack[++top] = j;
p = p->nextarc;
}
}
if(n == G->n)
return 1;
else
return 0;
}
4. 判断无向图G是否是一棵树
void DFS(AGraph *G,int v,int &vn,int &en)
{
ArcNode *p;
visit[v] = 1;
++vn; //vn计数器自增1
p = G->adjlist[v].firstarc;
while(p != NULL)
{
++en; //边数自增1
if(visit[p->adjvex] == 0)
DFS(G,p->adjvex,vn,en);
p = p->nextarc;
}
}
int GisTree(AGraph *G)
{
int vn=0,en=0,i;
for(i=0;i<G->n;++i)
visit[i] = 0;
DFS(G,1,vn,en);
//如果遍历过程中访问过的顶点数和图中的顶点数相等,
//且边数等于顶点数减1,则证明是树
if(vn == G->n && (G->n-1) == en/2)
return 1;
else
return 0;
}
5. 求不带权无向连通图G中距离顶点v最远的一个顶点
int BFS(AGraph *G,int v)
{
ArcNode *p; //边结点
int que[maxSize],front=0,rear=0;
int visit[maxSize];
int i,j;
for(i=0;i<G->n;i++)
visit[i]=0;
rear = (rear+1)%maxSize;
que[rear] = v;
visit[v] = 1;
while(front != rear)
{
front = (front+1)%maxSize;
j = que[front];
p = G->adjlist[j].firstarc;
while(p != NULL)
{
if(visit[p->adjvex] == 0)
{
visit[p->adjvex] = 1;
rear = (rear+1)%maxSize;
que[rear] = p->adjvex;
}
p = p->nextarc;
}
}
return j; //队空时,j保存了遍历过程中的最后一个顶点
}
6. 深度优先遍历非递归算法
void DFS(AGraph *g,int v)
{
ArcNode *p;
int stack[maxSize],top=-1; //定义一个栈来记录访问过程中的顶点
int i,k;
int visit[maxSize]; //顶点访问标记数组
for(i=0;i<g->n;++i)
visit[i] = 0;
Visit(v); //访问该顶点
visit[v] = 1; //标记起始顶点已被访问
stack[++top] = v; //起始顶点入栈
while(top != -1)
{
k = stack[top]; //取栈顶元素
p = g->adjlist[k].firstarc; //p指向该顶点的第一条边
//下面这个循环是p沿着边行走并将图中经过的顶点入栈的过程
while(p != NULL && visit[p->adjvex]==1)
p = p->nextarc; //找到当前顶点第一个没访问过的领接顶点或者p走到当前
//链表尾部时,while循环停止
if(p == NULL) //如果p到达当前链表尾部,则说明当前顶点的所有点都访问完毕
--top; //当前顶点出栈
else
{
Visit(p->adjvex);
visit[p->adjvex] = 1;
stack[++top] = p->adjvex;
}
}
}
7. 图采用领接表存储,判别顶点i和顶点j(i!=j)之间是否有路径
int DFSTrave(AGraph *G,int i,int j)
{
int k;
for(k=0;k<G->n;++k)
visit[k] = 0;
DFS(G,i); //可以换成BFS(G,i)
if(visit[j] == 1)
return 1;
else
return 0;
}