图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。
深度优先搜索(Depth First Search)
深度优先搜索假设初始状态下图中所有顶点都未被访问,尝试优先搜索从图中某个顶点v出去,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直到图中所有和v相连连的顶点都被访问到。如果此时图中还有没有访问到的顶点,则另选图中未被访问的某顶点作为起始点,重复上述过程,直到图中所有顶点都被访问到。具体实现如下:
- #include <cstdio>
- #include <cstdlib>
-
- #define VERTEXNUM 100 //顶点个数
- typedef char VertexType; //顶点类型
- typedef int EdgeType;
- typedef enum{FALSE, TRUE} Boolean;
- Boolean visited[VERTEXNUM];
-
- /**********************************************
- *
- * 邻接矩阵存储结构
- *
- **********************************************/
- typedef struct
- {
- VertexType vertexs[VERTEXNUM]; //顶点
- EdgeType edges[VERTEXNUM][VERTEXNUM]; //邻接矩阵
- int vernum, edgenum; //图中顶点和边数
- }Graph;
-
- /**********************************************
- *
- * 建立邻接矩阵
- *
- **********************************************/
- void MakeGraph(Graph *graph)
- {
- int i, j, k;
- printf("请输入顶点数和边数:\n");
- scanf("%d%d", &graph->vernum, &graph->edgenum);
- printf("请输入顶点信息(顶点号<CR>)每个顶点以回车作为结束:\n");
- for(i = 0; i < graph->vernum; i++)
- {
- getchar();
- scanf("%c", &graph->vertexs[i]);
- }
- for(i = 0; i < graph->vernum; i++) //初始化邻接矩阵
- {
- for(j = 0; j < graph->vernum; j++)
- {
- graph->edges[i][j] = 0;
- }
- }
- printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n");
- for(k = 0; k < graph->edgenum; k++)
- {
- scanf("%d,%d", &i, &j);
- graph->edges[i - 1][j - 1] = 1; //(vi->vj)将edges[i][j]设置为1表示i,j间存在边
- }
- }
-
- /**********************************************
- *
- * 深度优先搜索
- *
- **********************************************/
- void DFSTraverse(Graph *graph, int i)
- {
- printf("深度优先遍历:顶点%c\n", graph->vertexs[i]);
- visited[i] = TRUE;
- for(int j = 0; j < graph->vernum; j++)
- {
- if(graph->edges[i][j] == 1 && !visited[j])
- DFSTraverse(graph, j);
- }
- }
-
- void DFS(Graph *graph)
- {
- int i;
- for(i = 0; i < graph->vernum; i++)
- visited[i] = FALSE;
- for(i = 0; i < graph->vernum; i++)
- if(!visited[i])
- DFSTraverse(graph, i);
- }
-
- int main()
- {
- Graph *graph = (Graph *)malloc(sizeof(Graph));
- MakeGraph(graph); // 建立图
- DFS(graph); //深度优先搜索
-
- return 0;
- }
对于图一中的图,上述程序运行结果如图二。 图一
图二
深度优先搜索遍历图的时间复杂度为O(n^2),其中n为图中顶点个数。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。