算法分析与设计 PAT程序填空题 图的解析3

130 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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);
}