#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100//最大顶点数
typedef int VertexType;//顶点类型
typedef int EdgeType;
typedef struct{
VertexType vexs[MAXVEX];//顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵
int numVertexes, numEdges;//图中当前顶点数和边数
}MGraph;
//建立无向网图的邻接矩阵
void CreateMGraph(MGraph *G){
int i, j, k, w;
char n;
printf("输入顶点数和边数:\n");
scanf("%d%d", &G->numVertexes, &G->numEdges);
//读入顶点信息,建立顶点表
// for(i = 0; i < G->numVertexes; i++){
// printf("请输入第%d个顶点的信息:", i+1);
// scanf("%c", &G->vexs[i]);
// printf("\n");
// }
for (i = 0; i < G->numVertexes; i++)
{
printf("请输入第%d个顶点的信息:",i+1);
scanf("%d", &G->vexs[i]);
}
//邻接矩阵初始化
for(i = 0; i < G->numVertexes; i++){
for(j = 0; j < G->numVertexes; j++){
G->arc[i][j] = 0;
}
}
//读入numEdges条边,建立邻接矩阵
for(k = 0; k < G->numEdges; k++){
printf("输入边(vi, vj)上的下标i, 下标j:\n");
scanf("%d%d", &i, &j);
G->arc[i][j] = 1;
G->arc[j][i] = G->arc[i][j];//无向图,矩阵对称
}
}
//邻接矩阵的深度优先递归算法
void DFS(MGraph G, int i, int visited[]){
int j;
visited[i] = 1;
printf("%d\t", G.vexs[i]);
for(j = 0; j < G.numVertexes; j++){
if(G.arc[i][j] == 1 && !visited[j]){//若邻接点存在且未被访问
DFS(G, j, visited);//对未访问的邻接顶点递归调用
}
}
}
//邻接矩阵的深度遍历操作
void DFSTraverse(MGraph G, int visited[]){
int i;
for(i = 0; i < G.numVertexes; i++){
visited[i] = 0;//初始化所有顶点状态,都为未访问状态
}
printf("深度遍历: ");
for(i = 0; i < G.numVertexes; i++){
if(! visited[i]){//对未访问过的顶点调用DFS
DFS(G, i, visited);
}
}
}
int main(){
MGraph G;
CreateMGraph(&G);
int visited[G.numVertexes];//访问标志的数组
DFSTraverse(G, visited);
}
邻接矩阵的深度优先递归算法
最新推荐文章于 2023-01-31 10:16:39 发布