1、 圖的存儲(必做題,對書上代碼稍作修改)
(1)採用鄰接表或鄰接矩陣的形式構建圖
(2)輸入:圖的類型、頂點個數及頂點數據、每條邊,如
1 //0—有向圖,1—無向圖
4
A B C D //4個頂點,分別是A、B、C、D
3
A B
A C
B D //3條邊,分別是(A,B)、(A,C)、(B,D)
(3)有向圖和無向圖均要測試,鄰接表和鄰接矩陣至少選擇一種
2、 圖的遍歷(必做題,對書上代碼書稍作修改)
(1) 在鄰接表或鄰接矩陣的存儲結構上實現深度優先遍歷算法和廣度優先遍歷算法
(2) 按字典序對各個頂點排序,從最小頂點開始遍歷,輸出遍歷序列
(3) 深度優先遍歷和廣度優先遍歷均要實現
兩個題當一個題寫
基本思想
算法BFS
隊列Q初始化;
訪問頂點v;修改標誌visited[v]=1;頂點v入隊列Q;
While(隊列Q非空)
v=隊列Q的隊頭元素出隊;
w=頂點v的第一個鄰接點;
while(w存在)
如果w未被訪問,則
訪問頂點w;修改標誌visited[w]=1;頂點w入隊列Q;
w=頂點v下一個鄰接點;
算法DFS
訪問頂點v;修改標誌visited[v]=1;
w=頂點v的第一個鄰接點;
while(w存在)
if(w未被訪問)從頂點w出發遞歸執行該算法;
w=頂點v的下一個鄰接點;
點擊查看代碼main.cpp
#include <iostream>
#include <cstdio>
using namespace std;
const int MaxSize = 11;
class MGraph
{
public:
MGraph(T a[], int n, int e, int f); //構造函數,建立具有n個頂點e條邊的圖
void DFTraverse(int v); //深度優先遍歷圖
void BFTraverse(int v); //廣度優先遍歷圖
private:
T vertex[MaxSize]; //存放圖中頂點的數組
int edge[MaxSize][MaxSize]; //存放圖中邊的數組
int vertexNum, edgeNum; //圖的頂點數和邊數
};
bool visited[MaxSize];
template<typename T>
MGraph<T>::MGraph(T a[], int n, int e, int f) {
vertexNum = n; edgeNum = e;
for (int i = 0; i < vertexNum; i++)
vertex[i] = a[i];
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
edge[i][j] = 0;
if (f == 1)
for (int u, v, i = 0; i < edgeNum; ++i) {
cin >> u >> v;
edge[u][v] = edge[v][u] = 1;
}
else
for (int u, v, i = 0; i < edgeNum; ++i) {
cin >> u >> v;
edge[u][v] = 1;
}
return;
}
template<typename T>
void MGraph<T>::DFTraverse(int v)
{
cout << vertex[v] << ' ';
visited[v] = true;
for (int j = 0; j < vertexNum; ++j)
if (edge[v][j] == 1 && !visited[j])
DFTraverse(j);
}
template<typename T>
void MGraph<T>::BFTraverse(int v)
{
int w, j, Q[MaxSize]; //採用順序隊列
int front = -1, rear = -1; //初始化隊列
cout << vertex[v] << ' ';
visited[v] = true;
Q[++rear] = v; //被訪問頂點入隊
while (front != rear) //當隊列非空時
{
w = Q[++front]; //將隊頭元素出隊並送到v中
for (j = 0; j < vertexNum; ++j)
if (edge[w][j] == 1 && visited[j] == 0) {
cout << vertex[j];
visited[j] = true;
Q[++rear] = j;
}
}
cout << endl;
}
int main()
{
int choice, n, e;
char ch[MaxSize];
cout << "請輸入要選擇的圖的類型:" << endl << "1.無向圖" << endl << "2.有向圖" << endl;
cin >> choice;
cout << "請輸入頂點的個數:" << endl;
cin >> n;
cout << "請依次輸入頂點:" << endl;
for (int i = 0; i < n; ++i)
cin >> ch[i];
cout << "請輸入邊的的個數:" << endl;
cin >> e;
for (int i = 0; i < n; ++i)
visited[i] = false;
cout << "深度優先遍歷序列是:" << endl;
MG.DFTraverse(0);
cout << endl;
for (int i = 0; i < n; ++i)
visited[i] = false;
cout << "廣度優先遍歷序列是:" << endl;
MG.BFTraverse(0);
return 0;
}
/*
1
5
A B C D E
6
0 1
0 2
0 3
1 2
1 3
2 4
*/