無向圖樣式:
鄰接矩陣法類似於用數組儲存,一個一維數組儲存頂點信息,還有一個二維數組儲存鄰接矩陣
用鄰接矩陣進行無向圖的創建過程:
一,輸入總頂點數和邊數(幾個點,幾條邊)
eg:如圖所示即爲8點,9邊。
二,依次輸入點的信息存入頂點表中(每個點一個名字)
eg:如圖即可以寫爲ABCDEFGH。
三,初始化鄰接矩陣,將每個權值初始化爲最大值或零(每個邊賦一個值)
eg:上圖最開始初始化爲32767,即表示,所有連接的兩點之間距離都是32767
四,構造鄰接矩陣。
依次輸入每條邊依附的頂點和其權值,(輸入值後,先確定兩個頂點在圖中的位置,然後將權賦給兩點之間邊)
eg:輸入AB1,即代表A點B點之間的距離爲1;輸入AC2,即代表A點C點之間的距離爲2.
鄰接矩陣表示法深度優先搜索遍歷過程:
遍歷過程類似於遞歸過程。
先從你輸入的呢一點開始遍歷(因爲剛開始給全部都初始化值了,所以默認是任何一點與所有點都連接);
已經遍歷的點visited[i]賦值爲一,代表已經遍歷。
碰到不是默認值的數,即爲真正有連接的點,若該點已經被遍歷,則繼續向下,否則跳轉到該點。
等到某一點遍歷過後,再返回到上一層
eg:
如果上圖從A點開始遍歷,默認的話,A與其餘所有點都有連接,權值爲32767.若賦值AB1,AC1。
第一步:看AB是否連接,若AB連接,且B點尚未遍歷,則跳轉到B點
第二步:B點再開始遍歷,首先是BA,雖然BA連接,但是A點已經遍歷,所以找下一個真正連接的點,即爲D,
第三步:因爲BD連接且D尚未遍歷,所以從D開始,再以D爲起始點,開始遍歷
。。。。。。。。。。。
(根據代碼可知遍歷過程都是從i=0到i= A.point,所以每次都是按照ABCDEFGH進行遍歷)
運行截圖:
代碼:
#include<iostream>
using namespace std;
#define pointMax 100
#define MaxInt 32767
struct AMgroup
{
char VTchart[pointMax]; //頂點表
int AMchart[pointMax][pointMax]; //鄰接矩陣
int point, vert; //點,邊
};
int AMlocate(AMgroup A, char x)
{
for (int i = 0; i < A.point; i++) //依次輸入點的信息
{
if (A.VTchart[i] == x)
{
return i;
break;
}
}
}
void CreatAM(AMgroup &A)
{
cout << "輸入鄰接矩陣頂點數:"; //第一步
cin >> A.point;
cout << "輸入鄰接矩陣邊數:";
cin >> A.vert;
getchar();
char a[100];
cout << "輸入點的信息:"; //第二步
gets_s(a);
for (int i = 0; i < A.point; i++) //依次輸入點的信息
{
A.VTchart[i] = a[i];
}
for (int i = 0; i < A.point; i++) //初始換鄰接矩陣,邊的權值均設爲最大 //第三步
{
for (int j = 0; j < A.point; j++)
{
A.AMchart[i][j] = MaxInt;
}
}
cout << endl;
char v1, v2; int len;
for (int i = 1; i <= A.vert; i++) //構造鄰接矩陣
{
cout << "輸入第"<<i<<"條邊的兩個頂點以及權值:"; //第四步
cin >> v1 >> v2 >> len;
int m, n;
m = AMlocate(A, v1);
n = AMlocate(A, v2);
A.AMchart[m][n] = A.AMchart[n][m] = len;
}
}
int visited[100] = { 0 };
void Show(AMgroup &A, int v)
{
cout << A.VTchart[v];
visited[v] = 1;
for (int i = 0; i < A.point; i++)
{
if (A.AMchart[v][i] != MaxInt && visited[i] != 1)
{
Show(A, i);
}
}
}
int main()
{
AMgroup *A = new AMgroup;
CreatAM(*A);
int m;
cout << "\n從第幾個點開始遍歷:";
cin >> m;
Show(*A,m);
getchar();
}