C++鄰接矩陣建立圖及深度、廣度遍歷
阿新 • • 發佈:2019-02-16
#include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define VERTEX_MAX 26 //圖的最大頂點數 #define MAXVALUE 32767 //最大值(可設為一個最大整數) typedef struct //定義鄰接矩陣圖結構 { char Vertex[VERTEX_MAX]; //儲存頂點資訊(序號或字母) int Edges[VERTEX_MAX][VERTEX_MAX]; //儲存邊的權 int isTrav[VERTEX_MAX]; //遍歷標誌 int VertexNum; //頂點數量 int EdgeNum;//邊數量 int GraphType; //圖的型別(0:無向圖,1:有向圖) }MatrixGraph; void CreateMatrixGraph(MatrixGraph *G)//建立鄰接矩陣圖 { int i, j, k, weight; char start, end; //邊的起始頂點 for (i = 0; i < G->VertexNum; i++) //清空矩陣 { for (j = 0; j < G->VertexNum; j++) G->Edges[i][j] = MAXVALUE; //設定矩陣中各元素的值為最大值 } cout << "輸入各頂點資訊\n"; for (i = 0; i<G->VertexNum; i++) //輸入頂點 { printf("第%d個頂點:", i + 1); cin >> G->Vertex[i] ; //儲存到各頂點陣列元素中 } printf("輸入構成各邊的兩個頂點及權值:\n"); for (k = 0; k<G->EdgeNum; k++) //輸入邊的資訊 { printf("第%d條邊:", k + 1); cin >> start >> end >> weight; for (i = 0; start != G->Vertex[i]; i++); //在已有頂點中查詢始點 { for (j = 0; end != G->Vertex[j]; j++); //在已有頂點中查詢結終點 { G->Edges[i][j] = weight; //對應位置儲存權值,表示有一條邊 if (G->GraphType == 0) //若是無向圖 { G->Edges[j][i] = weight;//在對角位置儲存權值 } } } } } void OutMatrix(MatrixGraph *G)//輸出鄰接矩陣 { int i, j; for (j = 0; j<G->VertexNum; j++) printf("\t%c", G->Vertex[j]); //在第1行輸出頂點資訊 printf("\n"); for (i = 0; i<G->VertexNum; i++) { printf("%c", G->Vertex[i]); for (j = 0; j<G->VertexNum; j++) { if (G->Edges[i][j] == MAXVALUE) //若權值為最大值 printf("\t∞"); //輸出無窮大符號 else printf("\t%d", G->Edges[i][j]); //輸出邊的權值 } printf("\n"); } } void BFSfunction(MatrixGraph *G, int i)//廣度優先遍歷 { int j ; queue<int> Q; G->isTrav[i] = 1 ;//表示這個頂點已經被遍歷過了 cout <<"->"<< G->Vertex[i] ;//輸出第一個頂點 Q.push(i); //入佇列 while (!Q.empty()) { Q.pop(); for (j = 0; j < G->VertexNum; j++) { if (G->Edges[i][j] != MAXVALUE && !G->isTrav[j]) { cout << "->" << G->Vertex[j]; G->isTrav[j] = 1; Q.push(j); } } } } void BFSTraverse(MatrixGraph *G)//廣度優先 { int i; for (i = 0; i < G->VertexNum; i++) //表示其它頂點為被遍歷 G->isTrav[i] = 0; for (i = 0; i < G->VertexNum; i++) { if (!G->isTrav[i]) //若未被遍歷 BFSfunction(G, i);//遍歷一下 } } void DFSfunction(MatrixGraph *G, int i)//深度遍歷函式 { int j = 0; G->isTrav[i] = 1;//標記該頂點已經被遍歷過 cout << "->" << G->Vertex[i];//輸出第一個遍歷的頂點資訊 for (j = 0; j < G->VertexNum; j++)//迴圈遍歷其它頂點 { if (G->Edges[i][j] != MAXVALUE && !G->isTrav[i])//該結點有相連的其它頂點且未被遍歷且 { DFSfunction(G, j); } } } void DFSTraverse(MatrixGraph *G)//深度優先遍歷 { int i; for (i = 0; i < G->VertexNum; i++)//表示各頂點還沒有被遍歷 { G->isTrav[i] = 0; } for (i = 0; i < G->VertexNum; i++) { if (!G->isTrav[i])//若未被遍歷 DFSfunction(G, i);//遍歷一下 } cout << '\n'; } int _tmain(int argc, _TCHAR* argv[]) { MatrixGraph G; //定義儲存鄰接矩陣結構的圖 int i, j; cout << "輸入生成圖的型別(0:無向圖,1:有向圖):\n"; cin >> G.GraphType;//圖的種類 cout << "輸入圖的頂點數量和邊數量:\n"; cin >> G.VertexNum >> G.EdgeNum;//輸入圖頂點數和邊數 CreateMatrixGraph(&G); //建立用鄰接表儲存的圖 printf("鄰接矩陣資料如下:\n"); OutMatrix(&G); cout << "深度優先遍歷結點:"; DFSTraverse(&G); cout << "廣度優先遍歷結點:"; BFSTraverse(&G); cout << endl; system("pause"); return 0; }
IDE是vs2013.