深度优先遍历:
深度优先遍历(Depth_First_Search),也称为深度优先搜索,简称DFS。它从图中某个顶点V出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历,直至图中所有和v有路径想通的顶点都被访问到。若图中尚有未被访问的顶点,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
则实现代码如下:
typedef int Boolean;
Boolean visited[MAX];
void DFS(MGraph G, int i)
{
int j;
visited[i] = TRUE;
printf("%c",vexs[i]);
for(j = 0;j < G.numVertexes; j++)
{
if(G.arc[i][j] == 1 && !visited[j])
DFS(G,j);
}
}
void DFSTraverse(MGraph G)
{
int i;
for(i = 0;i < G.numVertexes;i++)
{
visited[i] = FALSE;
}
for(i = 0; i < G.numVertexes; i++)
{
if(!visited[i])
DFS(G,i);
}
}
如果图结构是邻接表结构,其DFSTraverse函数的代码是几乎相同的,只是在递归函数中因为将数组换成了链表而有不同,代码如下:
void DFS(GraphAdjList GL,int i)
{
EdgeType *p;
visited[i] = TRUE;
printf("%c",GL->adjList[i][j]);
p = GL->adjList[i].firstedge;
while(p)
{
if(!visited[p->adjvex])
DFS(GL,p->adjvex);
p = p->next;
}
}
void DFSTraverse(MGraph G)
{
int i;
for(i = 0;i < G.numVertexes;i++)
{
visited[i] = FALSE;
}
for(i = 0; i < G.numVertexes; i++)
{
if(!visited[i])
DFS(G,i);
}
}
广度优先遍历
广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS。以下是邻接矩阵结构的广度优先遍历算法:
void BFSTraverse(MGraph G)
{
int i,j;
Queue Q;
for(i = 0; i < G.numVertexes; i++)
{
visited[i] = FALSE;
}
InitQueue(&Q);
for(i = 0; i < G,numVertexes; i++)
{
if(!visited[i])
{
visited[i] = TRUE;
printf("%c",G.vexs[i]);
EnQueue(&Q,i);
while(!QueueEmpty(Q))
{
DeQueue(&Q,&i);
for(j = 0; j< G.numVertexes;j++)
{
if(G.arc[i][j] == 1 && !visited[j])
{
visited[j] = TRUE;
printf("%c",G.vexs[j]);
EnQueue(&Q,j);
}
}
}
}
}
}
最小生成树
把构造连通网的最小代价生成树称为最小生成树。其中最经典的算法有:普里姆算法和克鲁斯卡算法。