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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++实现图的广度和深度遍历

發布時間:2025/3/21 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++实现图的广度和深度遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<deque>using namespace std;template <typename T> class Graph {private:int Ne,Nv;//Nv為頂點數,Ne為邊數T *weight;//wieght為權重數組char *data;//data保存頂點數據int *visited;//用于遍歷 void coreDFS(int j){for(int i=0;i<Nv;i++){if(*(weight+j*Nv+i)==1 && !visited[i])//有鄰接點{printf("%c",data[i]);visited[i]=true;coreDFS(i);//找下一個節點并打印} } }public:Graph(int numV){Nv = numV;Ne = 0;weight = (T*)calloc(numV*numV*sizeof(int),1);data = (char*)calloc(numV,1);visited = (int*)calloc(numV*sizeof(int),1);//初始化數據 }bool initVertexData(const char *d){if(strlen(d)>=Nv){strncpy(data,d,Nv);//只復制Nv個節點數據 return true;}else{return false;}}bool insertEdge(char i,char j,T w)//有向圖還是無向圖 {int pi = strchr(data,i)-data;int pj = strchr(data,j)-data;if(pi<Nv&&pj<Nv){*(weight+pi*Nv+pj) = w;*(weight+pj*Nv+pi) = w;Ne++;//邊數加1 return true;}else{return false;}}void DFS(){memset(visited,0,Nv*sizeof(int));printf("\n");for(int i=0;i<Nv;i++)//對每個節點做一次深度遍歷 {if(!visited[i]){visited[i]=true;printf("%c",data[i]);coreDFS(i);}}printf("\n");}void BFS(){memset(visited,0,Nv*sizeof(int));//標記為沒有訪問過deque<int> q;printf("\n");for(int i=0;i<Nv;i++)//進行廣度優先搜索 {q.push_back(i);while(!q.empty()){int k = q.front();q.pop_front(); if(!visited[k]){//沒有訪問,先訪問 printf("%c",data[k]);visited[k]=true;//標記為已訪問 }for(int j=0;j<Nv;j++){if(*(weight+i*Nv+j)==1 && !visited[j]){printf("%c",data[j]);visited[j] = true;q.push_back(j);//下一次要遍歷的頂點 }}}}printf("\n");}void showSelf(){for(int i=0;i<Nv;i++){for(int j=0;j<Nv;j++){printf("%d\t",*(weight+i*Nv+j));}printf("\n");}}//用于調試,打印鄰接表 };int main() { Graph<int> g = Graph<int>(5);//建立一個有5個頂點的圖,weight為int型g.initVertexData("abcde");g.insertEdge('a','b',1);g.insertEdge('a','c',1);g.insertEdge('c','e',1);g.insertEdge('a','d',1);g.insertEdge('e','d',1);cout << "深度遍歷:";g.DFS();cout << "廣度遍歷:";g.BFS();g.showSelf();return 0; }

遍歷的圖:

結果:

總結

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

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