當(dāng)前位置:
首頁(yè) >
图的遍历[摘录自严长生老师的网站]
發(fā)布時(shí)間:2025/3/15
41
豆豆
生活随笔
收集整理的這篇文章主要介紹了
图的遍历[摘录自严长生老师的网站]
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
圖有兩種遍歷方式,深度優(yōu)先遍歷和廣度優(yōu)先遍歷
以下面這幅圖為例
深度優(yōu)先遍歷生成序列為?V1 -> V2 -> V4 -> V8 -> V5 -> V3 -> V6 -> V7
廣度優(yōu)先遍歷生成序列為?V1 -> V2 -> v3 -> V4 -> V5 -> V6 -> V7 -> V8
深度優(yōu)先,就是一路向下,直到?jīng)]有鄰接點(diǎn)為止,然后向上回溯。
廣度優(yōu)先,就是逐層訪問(wèn)。
代碼實(shí)現(xiàn)
深度優(yōu)先
#include <stdio.h> #define MAX_VERtEX_NUM 20 //頂點(diǎn)的最大個(gè)數(shù) #define VRType int //表示頂點(diǎn)之間的關(guān)系的變量類型 #define InfoType char //存儲(chǔ)弧或者邊額外信息的指針變量類型 #define VertexType int //圖中頂點(diǎn)的數(shù)據(jù)類型 typedef enum{false,true}bool; //定義bool型常量 bool visited[MAX_VERtEX_NUM]; //設(shè)置全局?jǐn)?shù)組,記錄標(biāo)記頂點(diǎn)是否被訪問(wèn)過(guò) typedef struct {VRType adj; //對(duì)于無(wú)權(quán)圖,用 1 或 0 表示是否相鄰;對(duì)于帶權(quán)圖,直接為權(quán)值。InfoType * info; //弧或邊額外含有的信息指針 }ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM]; typedef struct {VertexType vexs[MAX_VERtEX_NUM]; //存儲(chǔ)圖中頂點(diǎn)數(shù)據(jù)AdjMatrix arcs; //二維數(shù)組,記錄頂點(diǎn)之間的關(guān)系int vexnum,arcnum; //記錄圖的頂點(diǎn)數(shù)和弧(邊)數(shù) }MGraph; //根據(jù)頂點(diǎn)本身數(shù)據(jù),判斷出頂點(diǎn)在二維數(shù)組中的位置 int LocateVex(MGraph * G,VertexType v){int i=0;//遍歷一維數(shù)組,找到變量vfor (; i<G->vexnum; i++) {if (G->vexs[i]==v) {break;}}//如果找不到,輸出提示語(yǔ)句,返回-1if (i>G->vexnum) {printf("no such vertex.\n");return -1;}return i; } //構(gòu)造無(wú)向圖 void CreateDN(MGraph *G){scanf("%d,%d",&(G->vexnum),&(G->arcnum));for (int i=0; i<G->vexnum; i++) {scanf("%d",&(G->vexs[i]));}for (int i=0; i<G->vexnum; i++) {for (int j=0; j<G->vexnum; j++) {G->arcs[i][j].adj=0;G->arcs[i][j].info=NULL;}}for (int i=0; i<G->arcnum; i++) {int v1,v2;scanf("%d,%d",&v1,&v2);int n=LocateVex(G, v1);int m=LocateVex(G, v2);if (m==-1 ||n==-1) {printf("no this vertex\n");return;}G->arcs[n][m].adj=1;G->arcs[m][n].adj=1;//無(wú)向圖的二階矩陣沿主對(duì)角線對(duì)稱} } int FirstAdjVex(MGraph G,int v) {//查找與數(shù)組下標(biāo)為v的頂點(diǎn)之間有邊的頂點(diǎn),返回它在數(shù)組中的下標(biāo)for(int i = 0; i<G.vexnum; i++){if( G.arcs[v][i].adj ){return i;}}return -1; } int NextAdjVex(MGraph G,int v,int w) {//從前一個(gè)訪問(wèn)位置w的下一個(gè)位置開始,查找之間有邊的頂點(diǎn)for(int i = w+1; i<G.vexnum; i++){if(G.arcs[v][i].adj){return i;}}return -1; } void visitVex(MGraph G, int v){printf("%d ",G.vexs[v]); } void DFS(MGraph G,int v){visited[v] = true;//標(biāo)記為truevisitVex( G, v); //訪問(wèn)第v 個(gè)頂點(diǎn)//從該頂點(diǎn)的第一個(gè)邊開始,一直到最后一個(gè)邊,對(duì)處于邊另一端的頂點(diǎn)調(diào)用DFS函數(shù)for(int w = FirstAdjVex(G,v); w>=0; w = NextAdjVex(G,v,w)){//如果該頂點(diǎn)的標(biāo)記位false,證明未被訪問(wèn),調(diào)用深度優(yōu)先搜索函數(shù)if(!visited[w]){DFS(G,w);}} } //深度優(yōu)先搜索 void DFSTraverse(MGraph G){//int v;//將用做標(biāo)記的visit數(shù)組初始化為falsefor( v = 0; v < G.vexnum; ++v){visited[v] = false;}//對(duì)于每個(gè)標(biāo)記為false的頂點(diǎn)調(diào)用深度優(yōu)先搜索函數(shù)for( v = 0; v < G.vexnum; v++){//如果該頂點(diǎn)的標(biāo)記位為false,則調(diào)用深度優(yōu)先搜索函數(shù)if(!visited[v]){DFS( G, v);}} } int main() {MGraph G;//建立一個(gè)圖的變量CreateDN(&G);//初始化圖DFSTraverse(G);//深度優(yōu)先搜索圖return 0; }輸出
8,9 1 2 3 4 5 6 7 8 1,2 2,4 2,5 4,8 5,8 1,3 3,6 6,7 7,3 1 2 4 8 5 3 6 7廣度優(yōu)先
#include <stdio.h> #include <stdlib.h> #define MAX_VERtEX_NUM 20 //頂點(diǎn)的最大個(gè)數(shù) #define VRType int //表示頂點(diǎn)之間的關(guān)系的變量類型 #define InfoType char //存儲(chǔ)弧或者邊額外信息的指針變量類型 #define VertexType int //圖中頂點(diǎn)的數(shù)據(jù)類型 typedef enum{false,true}bool; //定義bool型常量 bool visited[MAX_VERtEX_NUM]; //設(shè)置全局?jǐn)?shù)組,記錄標(biāo)記頂點(diǎn)是否被訪問(wèn)過(guò) typedef struct Queue{VertexType data;struct Queue * next; }Queue; typedef struct {VRType adj; //對(duì)于無(wú)權(quán)圖,用 1 或 0 表示是否相鄰;對(duì)于帶權(quán)圖,直接為權(quán)值。InfoType * info; //弧或邊額外含有的信息指針 }ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM]; typedef struct {VertexType vexs[MAX_VERtEX_NUM]; //存儲(chǔ)圖中頂點(diǎn)數(shù)據(jù)AdjMatrix arcs; //二維數(shù)組,記錄頂點(diǎn)之間的關(guān)系int vexnum,arcnum; //記錄圖的頂點(diǎn)數(shù)和弧(邊)數(shù) }MGraph; //根據(jù)頂點(diǎn)本身數(shù)據(jù),判斷出頂點(diǎn)在二維數(shù)組中的位置 int LocateVex(MGraph * G,VertexType v){int i=0;//遍歷一維數(shù)組,找到變量vfor (; i<G->vexnum; i++) {if (G->vexs[i]==v) {break;}}//如果找不到,輸出提示語(yǔ)句,返回-1if (i>G->vexnum) {printf("no such vertex.\n");return -1;}return i; } //構(gòu)造無(wú)向圖 void CreateDN(MGraph *G){scanf("%d,%d",&(G->vexnum),&(G->arcnum));for (int i=0; i<G->vexnum; i++) {scanf("%d",&(G->vexs[i]));}for (int i=0; i<G->vexnum; i++) {for (int j=0; j<G->vexnum; j++) {G->arcs[i][j].adj=0;G->arcs[i][j].info=NULL;}}for (int i=0; i<G->arcnum; i++) {int v1,v2;scanf("%d,%d",&v1,&v2);int n=LocateVex(G, v1);int m=LocateVex(G, v2);if (m==-1 ||n==-1) {printf("no this vertex\n");return;}G->arcs[n][m].adj=1;G->arcs[m][n].adj=1;//無(wú)向圖的二階矩陣沿主對(duì)角線對(duì)稱} } int FirstAdjVex(MGraph G,int v) {//查找與數(shù)組下標(biāo)為v的頂點(diǎn)之間有邊的頂點(diǎn),返回它在數(shù)組中的下標(biāo)for(int i = 0; i<G.vexnum; i++){if( G.arcs[v][i].adj ){return i;}}return -1; } int NextAdjVex(MGraph G,int v,int w) {//從前一個(gè)訪問(wèn)位置w的下一個(gè)位置開始,查找之間有邊的頂點(diǎn)for(int i = w+1; i<G.vexnum; i++){if(G.arcs[v][i].adj){return i;}}return -1; } //操作頂點(diǎn)的函數(shù) void visitVex(MGraph G, int v){printf("%d ",G.vexs[v]); } //初始化隊(duì)列 void InitQueue(Queue ** Q){(*Q)=(Queue*)malloc(sizeof(Queue));(*Q)->next=NULL; } //頂點(diǎn)元素v進(jìn)隊(duì)列 void EnQueue(Queue **Q,VertexType v){Queue * element=(Queue*)malloc(sizeof(Queue));element->data=v;Queue * temp=(*Q);while (temp->next!=NULL) {temp=temp->next;}temp->next=element; } //隊(duì)頭元素出隊(duì)列 void DeQueue(Queue **Q,int *u){(*u)=(*Q)->next->data;(*Q)->next=(*Q)->next->next; } //判斷隊(duì)列是否為空 bool QueueEmpty(Queue *Q){if (Q->next==NULL) {return true;}return false; } //廣度優(yōu)先搜索 void BFSTraverse(MGraph G){//int v;//將用做標(biāo)記的visit數(shù)組初始化為falsefor( v = 0; v < G.vexnum; ++v){visited[v] = false;}//對(duì)于每個(gè)標(biāo)記為false的頂點(diǎn)調(diào)用深度優(yōu)先搜索函數(shù)Queue * Q;InitQueue(&Q);for( v = 0; v < G.vexnum; v++){if(!visited[v]){visited[v]=true;visitVex(G, v);EnQueue(&Q, G.vexs[v]);while (!QueueEmpty(Q)) {int u;DeQueue(&Q, &u);u=LocateVex(&G, u);for (int w=FirstAdjVex(G, u); w>=0; w=NextAdjVex(G, u, w)) {if (!visited[w]) {visited[w]=true;visitVex(G, w);EnQueue(&Q, G.vexs[w]);}}}}} } int main() {MGraph G;//建立一個(gè)圖的變量CreateDN(&G);//初始化圖BFSTraverse(G);//廣度優(yōu)先搜索圖return 0; }輸出
8,9 1 2 3 4 5 6 7 8 1,2 2,4 2,5 4,8 5,8 1,3 3,6 6,7 7,3 1 2 3 4 5 6 7 8
轉(zhuǎn)載于:https://www.cnblogs.com/wzyuan/p/10033500.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的图的遍历[摘录自严长生老师的网站]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 树形视图
- 下一篇: 函数,名称空间——day11