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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构-图及其遍历

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-图及其遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖-鄰接矩陣

#include<iostream> #define MAX_VERTS 20 using namespace std; //鄰接矩陣 浪費空間class Vertex { //頂點 public:Vertex(char lab) { Label = lab; } private:char Label; };class Graph { //圖 public:Graph();~Graph();void addVertex(char lab);void addEdge(int start, int end);void printMatrix(); private:Vertex* vertexList[MAX_VERTS];int nVerts;int adjMat[MAX_VERTS][MAX_VERTS]; }; Graph::Graph() {nVerts = 0;for (int i = 0; i < MAX_VERTS; i++){for (int j = 0; j < MAX_VERTS; j++){adjMat[i][j] = 0;}} }void Graph::addVertex(char lab) {vertexList[nVerts++] = new Vertex(lab); }void Graph::addEdge(int start,int end) {adjMat[start][end] = 1;adjMat[end][start] = 1; }void Graph::printMatrix() {for (int i = 0; i < nVerts; i++){for (int j = 0; j < nVerts; j++){cout<<adjMat[i][j] <<" ";}cout << endl;}} Graph::~Graph() {for (int i = 0; i < nVerts; i++){delete vertexList[i]; //vertexList[i]內為指針} }int main() {Graph g;g.addVertex('A'); //0g.addVertex('B'); //1g.addVertex('C'); //2g.addVertex('D'); //3g.addVertex('E'); //4g.addEdge(0, 1); //A-Bg.addEdge(0, 3); //A-Dg.addEdge(1, 0); //B-A g.addEdge(1, 4); //B-E 和 E-B會不會重復g.addEdge(2, 4); //C-Eg.addEdge(3, 0); //D-Ag.addEdge(3, 4); //D-Eg.addEdge(4, 1); //E-Bg.addEdge(4, 2); //E-Cg.addEdge(4, 3); //E-Dg.printMatrix();system("pause");return 0; }

?

圖-鄰接表

#include<iostream> #include<list> using namespace std; class Vertex {};template<class T> class Graph { private:T** VertexList; //存頂點的數組list<int>* HeadNodes; int n; //頂點個數int nVerts; //計數頂點數 public:Graph(const int vertices) :n(vertices){VertexList = new T*[n]; //n個數組HeadNodes = new list<int>[n]; //n個鏈表分別存在n個數組里nVerts = 0;}~Graph(){delete[] VertexList;delete[] HeadNodes;}void addVertext(T* v);void addEdge(int start, int end);void printVertice();void printAdjList();};template<class T> void Graph<T>::addVertext(T* v) {VertexList[nVerts++] = v; }template<class T> void Graph<T>::addEdge(int start,int end) {HeadNodes[start].push_back(end); }template<class T> void Graph<T>::printVertice() {for (int i = 0; i < nVerts; i++){cout << *VertexList[i] << " ";}cout << endl; } template<class T> void Graph<T>::printAdjList() {for (int i = 0; i < nVerts; i++){cout << i << "->";for (list<int> ::iterator iter = HeadNodes[i].begin(); iter != HeadNodes[i].end();++iter){cout << *iter << "->";}cout << "end" << endl;;}}int main() {Graph<char> g(5);char a = 'A';char b = 'B';char c = 'C';char d = 'D';char e = 'E';g.addVertext(&a);g.addVertext(&b);g.addVertext(&c);g.addVertext(&d);g.addVertext(&e);g.printVertice();g.addEdge(0, 1); //A-Bg.addEdge(0, 3); //A-Dg.addEdge(1, 0); //B-A g.addEdge(1, 4); //B-E 和 E-B會不會重復g.addEdge(2, 4); //C-Eg.addEdge(3, 0); //D-Ag.addEdge(3, 4); //D-Eg.addEdge(4, 1); //E-Bg.addEdge(4, 2); //E-Cg.addEdge(4, 3); //E-Dg.printAdjList();system("pause");return 0; }

圖的搜索

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

圖-DFS深度優先搜索

只有有下一個結點就一直往下走,知道沒有再往回走

?

圖-BFS廣度優先搜索

一層一層搜索

#include<iostream> #include<stack> #include<queue> #define MAX_VERTS 20 using namespace std; //鄰接矩陣 浪費空間class Vertex { //頂點 public:Vertex(char lab) { Label = lab; wasVisited = false;} public:bool wasVisited;char Label;};class Graph { //圖 public:Graph();~Graph();void addVertex(char lab);void addEdge(int start, int end);void printMatrix();void showVertex(int v);void DFS();void BFS(); private:Vertex* vertexList[MAX_VERTS];int nVerts;int adjMat[MAX_VERTS][MAX_VERTS];int getAdjUnvisitedVertex(int v); }; void Graph::DFS() {stack<int> gStack; //保存頂點下標vertexList[0]->wasVisited = true;showVertex(0);gStack.push(0);int v;while (gStack.size() > 0){v = getAdjUnvisitedVertex(gStack.top());if (v==-1){gStack.pop();}else{vertexList[v]->wasVisited = true;showVertex(v);gStack.push(v);}}cout << endl;for (int j = 0; j < nVerts; j++){vertexList[j]->wasVisited = false;} } void Graph::BFS() {queue<int> gQueue;vertexList[0]->wasVisited = true;showVertex(0);gQueue.push(0);int vert1, vert2;while (gQueue.size() > 0){vert1 = gQueue.front();gQueue.pop();vert2 = getAdjUnvisitedVertex(vert1);while (vert2 != -1){vertexList[vert2]->wasVisited = true;showVertex(vert2);gQueue.push(vert2);vert2 = getAdjUnvisitedVertex(vert1);}}cout << endl;for (int i = 0; i < nVerts; i++){vertexList[i]->wasVisited = false;} } int Graph::getAdjUnvisitedVertex(int v) {for (int i = 0; i < nVerts; i++){if ((adjMat[v][i] == 1) && (vertexList[i]->wasVisited == false))return i;}return -1; } void Graph::showVertex(int v) {cout << vertexList[v]->Label << " "; } Graph::Graph() {nVerts = 0;for (int i = 0; i < MAX_VERTS; i++){for (int j = 0; j < MAX_VERTS; j++){adjMat[i][j] = 0;}} }void Graph::addVertex(char lab) {vertexList[nVerts++] = new Vertex(lab); }void Graph::addEdge(int start,int end) {adjMat[start][end] = 1;adjMat[end][start] = 1; }void Graph::printMatrix() {for (int i = 0; i < nVerts; i++){for (int j = 0; j < nVerts; j++){cout<<adjMat[i][j] <<" ";}cout << endl;}} Graph::~Graph() {for (int i = 0; i < nVerts; i++){delete vertexList[i]; //vertexList[i]內為指針} }int main() {Graph g;g.addVertex('A'); //0g.addVertex('B'); //1g.addVertex('C'); //2g.addVertex('D'); //3g.addVertex('E'); //4g.addEdge(0, 1); //A-Bg.addEdge(0, 3); //A-Dg.addEdge(1, 0); //B-A g.addEdge(1, 4); //B-E 和 E-B會不會重復g.addEdge(2, 4); //C-Eg.addEdge(3, 0); //D-Ag.addEdge(3, 4); //D-Eg.addEdge(4, 1); //E-Bg.addEdge(4, 2); //E-Cg.addEdge(4, 3); //E-Dg.printMatrix();cout << "深度優先搜索的結果:";g.DFS();cout << "廣度優先搜索的結果:";g.BFS();system("pause");return 0; }

?運行結果:

?

?

總結

以上是生活随笔為你收集整理的数据结构-图及其遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

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