邻接矩阵的DFS
const int MAXN = 100;bool visited[MAXN];struct MGraph{ int vexs[MAXN];//顶点表 int arc[MAXN][MAXN];//邻接矩阵 int numEdges, numVertexes;//边,点的数量};void DFS(MGraph *G,int i){ int j; visited[i] = 1; cout << G->vexs << ' ';//输出节点信息也可以进行其他操作 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] = 0; for (i = 0; i < G->numVertexes; i++) if (!visited[i])//未访问过的顶点调用DFS,若是连通图,则只执行一次 DFS(G, i);}
邻接表的DFS
const int MAXN = 100;bool visited[MAXN];struct EdgeNode{ int adjvex; EdgeNode *next;};struct VexNode{ int data; EdgeNode *firstedge;};struct Grapha{ VexNode list[MAXN]; int numVertexes, numEdges;};void DFS(Grapha *G, int i){ EdgeNode *p; visited[i] = 1; cout << G->list[i].data << ' ';//输出节点信息,也可以进行其他操作 p = G->list[i].firstedge; while (p) { if (!visited[p->adjvex]) DFS(G, p->adjvex); p = p->next; }}void DFSTraverse(Grapha *G){ for (int i = 0; i < G->numVertexes; i++)//初始化 visited[i] = 0; for (int i = 0; i < G->numVertexes; i++)//若为连通图,只执行一次 if (!visited[i]) DFS(G, i);}
邻接矩阵的BFS
const int MAXN = 1000;int visited[MAXN];struct MGraph{ int vexs[MAXN];//顶点表 int arc[MAXN][MAXN];//邻接矩阵 int numEdges, numVertexes;//边,点的数量};void BFSTraverse(MGraph G){ int i, j; queue Q; for (int i = 0; i < G.numVertexes; i++) visited[i] = 0; for (int i = 0; i < G.numVertexes; i++) { if (!visited[i]) { visited[i] = 1; cout << G.vexs[i] << ' '; Q.push(i); while (!Q.empty()) { int t = Q.front(); Q.pop(); for (int j = 0; j < G.numVertexes; j++) { if (G.arc[t][j] == 1 && !visited[j]) { visited[j] = 1; cout << G.vexs[j] << ' '; Q.push(j); } } } } }}
邻接表的BFS
const int MAXN = 1000;int visited[MAXN];struct EdgeNode //边表节点{ int adjvex;//邻接点域(有向图中弧头下标) EdgeNode *next;//指向下一个边表};struct VertexNode //顶点表节点{ char data;//顶点域 EdgeNode *firstedge;//边表头指针};struct GraphAdjList//图{ VertexNode adjList[MAXN];//顶点表数组 int numVertexea, numEdges;//图中顶点数和边数};void BFSTraverse(GraphAdjList G){ queue Q; for (int i = 0; i < G.numVertexea; i++) visited[i] = 0; for (int i = 0; i < G.numVertexea; i++) { if (!visited[i]) { visited[i] = 1; cout << G.adjList[i].data << ' '; Q.push(i); while (!Q.empty()) { int t = Q.front(); Q.pop(); EdgeNode *p = G.adjList[t].firstedge; while (p) { if (!visited[p->adjvex]) { visited[p->adjvex] = 1; cout << G.adjList[p->adjvex].data << ' '; Q.push(p->adjvex); } p = p->next; } } } }}