日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的遍历递归和非递归实现

發布時間:2025/6/15 编程问答 5 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的遍历递归和非递归实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因為深度優先需要無路可走時按照來路往回退,正好是后進先出
廣度優先則需要保證先訪問頂點的未訪問鄰接點先訪問,恰好就是先進先出 廣度不能用遞歸 ? 圖的廣度優先搜索確實沒法使用遞歸,但上面那句話也確實是理解錯誤。

圖的廣度優先搜索是一種分層的查找過程,它并不是一個遞歸的賽程。為了實現這種逐層的訪問,算法必須借助一個隊列。



#include<iostream> #include<queue> #include<stack> #include<stdlib.h> #define MAX 100 using namespace std;typedef struct {int edges[MAX][MAX]; //鄰接矩陣int n; //頂點數int e; //邊數 }MGraph;bool visited[MAX]; //標記頂點是否被訪問過void creatMGraph(MGraph &G) //用引用作參數 {int i,j;int s,t; //存儲頂點編號int v; //存儲邊的權值for(i=0;i<G.n;i++) //初始化{for(j=0;j<G.n;j++){G.edges[i][j]=0;}visited[i]=false;}for(i=0;i<G.e;i++) //對矩陣相鄰的邊賦權值{scanf("%d %d %d",&s,&t,&v); //兩個頂點確定一條邊 //輸入邊的頂點編號以及權值G.edges[s][t]=v;} }void DFS(MGraph G,int v) //深度優先搜索 {int i;printf("%d ",v); //訪問結點vvisited[v]=true;for(i=0;i<G.n;i++) //訪問與v相鄰的未被訪問過的結點{if(G.edges[v][i]!=0&&visited[i]==false){DFS(G,i);//若沒訪問則繼續,而且根據頂點的序號按數序訪問}} } //stack彈出順序有問題 void DFS1(MGraph G,int v) //非遞歸實現 {stack<int> s;printf("%d ",v); //訪問初始結點visited[v]=true;s.push(v); //入棧while(!s.empty()){int i,j;i=s.top(); //取棧頂頂點for(j=0;j<G.n;j++) //訪問與頂點i相鄰的頂點{if(G.edges[i][j]!=0&&visited[j]==false){printf("%d ",j); //訪問visited[j]=true;s.push(j); //訪問完后入棧break; //找到一個相鄰未訪問的頂點,訪問之后則跳出循環}} //對于節點4,找完所有節點發現都已訪問過或者沒有臨邊,所以j此時=節點總數,然后把這個4給彈出來 直到彈出1,之前的深度搜索的值都已彈出,有半部分還沒有遍歷,開始遍歷有半部分if(j==G.n) //如果與i相鄰的頂點都被訪問過,則將頂點i出棧s.pop();} }void BFS(MGraph G,int v) //廣度優先搜索 {queue<int> Q; //STL模板中的queueprintf("%d ",v);visited[v]=true;Q.push(v);while(!Q.empty()) {int i,j;i=Q.front(); //取隊首頂點Q.pop();//彈出一個,然后遍歷這個節點的子節點,然后遍歷完再彈出下一個for(j=0;j<G.n;j++) //廣度遍歷{if(G.edges[i][j]!=0&&visited[j]==false){printf("%d ",j);visited[j]=true;Q.push(j);}}} }int main(void) {int n,e; //建立的圖的頂點數和邊數while(scanf("%d %d",&n,&e)==2&&n>0){MGraph G;G.n=n;G.e=e;creatMGraph(G);DFS(G,0);printf("\n");// DFS1(G,0);// printf("\n");// BFS(G,0);// printf("\n");}return 0; }

總結

以上是生活随笔為你收集整理的图的遍历递归和非递归实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。