本文已参与「新人创作礼」活动,一起开启掘金创作之路。
5-11 本题要求实现对图的深度优先遍历,并输出结点信息,采用邻接矩阵表示方法。
题目代码:
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>//使用INT_MAX宏,指定整数变量不能存储超出此限制的任何值
typedef struct GRAPHMATRIX_STRU
{
int size; //图中结点的个数
int **graph; //二维数组保存图
}GraphMatrix;
GraphMatrix* InitGraph(int num);//创建图,略
void ReadGraph(GraphMatrix* graphMatrix);//输入顶点和权值,略
/*从结点i开始深度优先遍历 */
void DFS(GraphMatrix* graphMatrix, int * visited, int i) //参数1表示图graphMatrix,参数2表示标记数组visited,参数3表示访问顶点位置i
{
int j;
visited[i] = 1;
printf("%d ", i);
for (j = 0; j < graphMatrix->size; j++) //在顶点i的基础上继续深度遍历与之相连的顶点间的边
{
if (graphMatrix->graph[i][j] != INT_MAX && !visited[j]) //没有访问过,并且i与j之间有边
DFS(graphMatrix,visited,j); //在j的基础上继续DFS遍历
}
}
/*图的深度优先遍历*/
void DFSGraphMatrix(GraphMatrix* graphMatrix) //参数表示图graphMatrix
{
int i;
int *visited = (int*)malloc(sizeof(int)* graphMatrix->size);
for (i = 0; i < graphMatrix->size; i++) //将visited数组初始值全部置为0,表示没有访问过
visited[i] = 0;
for (i = 0; i < graphMatrix->size; i++) //依次遍历图的顶点
if(!visited[i]) //i没有访问过的话,则DFS
DFS(graphMatrix,visited,i); //传入顶点i的参数
}
int main()
{
GraphMatrix *graphMatrix = NULL;
graphMatrix = InitGraph(7); //传入顶点个数7
ReadGraph(graphMatrix);
DFSGraphMatrix(graphMatrix);
return 0;
}
5-15 对一个给定的图G执行拓扑排序,其中TopNum[]从1开始记录拓扑序。
拓扑排序思路:
此拓扑排序的思想是:
1.从有向图中选取一个没有前驱的顶点(入度为0),并输出之;
2.从有向图中删去此顶点以及所有以它为尾的弧;
3.重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
题目代码:
void Topsort( Graph G )
{
Queue Q;
Vertex V, W;
NodePtr ptr;
int counter = 0;
Q = CreateEmptyQueue(NumVertex); //创建一个空队列
for ( V=0; V<G->NumV; V++ )
if ( Indegree[V] == 0 ) //入度0,入队
Enqueue(V, Q);
while (!IsEmpty(Q)){ //队列不空
V = Dequeue(Q); //V队首出队
TopNum[V] = ++counter; //记录这个顶点的序列号,且序号从1开始,是前置自增
for(ptr=G->List[V]; ptr; ptr=ptr->Next) {
W = ptr->Vertex;
if ( Indegree[W] == 0 )//W入度0,入队
Enqueue(W, Q);
}
}
if ( counter != NumVertex )
printf("ERROR: Graph has a cycle.\n");
DisposeQueue(Q);
}