實驗題目:
「六度空間」理論又稱作「六度分隔(six degrees of separation)」理論。這個理論可以通俗地闡述為:「你和任何乙個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何乙個陌生人。」
也就是在無向圖中,以節點作為人,兩個節點之間的路徑小於等於6。
實驗要求
求出與乙個節點滿足上述要求的其他節點的數目,初始值為1
如圖 以a, b為例
a: 沒有與a滿足上述條件的點.因此。a節點的值為0
b: d c e h g f都滿足條件 因此b節點的值就是7
實驗思路:
即無向圖的廣度優先遍歷
1.圖的儲存
書上講過無向圖的儲存最好是鄰接多重鍊錶,但是看起來比較麻煩,我就偷懶用了鄰接表來儲存
建立方式,定義表頭節點和表節點
typedef struct edgenode
edgenode;
//頂點表節點結構,tag用來判定是否被遍歷過,乙個firstedge是用來指向邊表的第乙個節點
typedef struct
adjlist;
定義表頭節點的陣列,表的初始化就完成了。
儲存圖,忽略節點名字,以陣列下標代替節點名。tag初始為0,輸入一條邊的頭尾節點,在頭尾節點對應的表頭節點後加入資訊。
實現**
void add(int x, int y)
else
q = new edgenode;
q->adjvex = y - 1;
q->next = null;
p->next = q;
}// 無向圖,一條邊對應兩個結點
if (adjlist[y - 1].firstedge == null)
else
q = new edgenode;
q->adjvex = x - 1;
q->next = null;
p->next = q;}}
2.圖的廣度優先遍歷
在上述儲存結構的前提下,以每個節點為初始節點,依次進行廣度優先遍歷
思路:定義兩個佇列,用來儲存本次訪問節點的下標和下次訪問節點的下標,以便於計算路徑長度。在本次訪問節點佇列不空的情況下,再次進行迴圈,直到空為止,迴圈第一次結束。依次類推
下面以圖的形式具體說明
第一次以0下標開始,tag置為1,表示被訪問過。本次佇列和下次佇列都為null
首先進行本次佇列賦值,此時路徑為1
之後再本次佇列不為空並且路徑小於6的前提下進行另乙個迴圈
①以本次佇列中的資料作為起始位置,若遍歷的節點中,tag為0,則該節點進入下次佇列,直到本次佇列空為止。此時資料的狀態為
此時將下次佇列的值賦給本次佇列,此時路徑變為2
繼續進行迴圈①
①迴圈結束之後 將所有tag置為0,佇列清空進行以下乙個節點為初始節點的計算,重複上述過程直到迴圈結束
實現**
void bl(int x)
queueq;
queuer;
for (int i = 0; i < num_vertex; i++)
if (!p->next)
if (p->next)
}k++;
// 記錄路徑長度為2~6的節點個數,q佇列中存入本次次廣度遍歷的節點,r佇列存入下一次廣度
// 遍歷的節點。來區分不同的路徑長度
while (!q.empty() && k < 6)
if (!p->next)
else p = p->next;
}if (q.empty() && !r.empty())
k++;}}
// 初始化資料,準備進行從下乙個節點開始的廣度遍歷
for (int j = 0; j < num_vertex; j++)
while (!q.empty())
while (!r.empty())
}
資料結構 六度空間(模擬六度分隔理論)
六度空間 理論又稱作 六度分隔 six degrees of separation 理論。這個理論可以通俗地闡述為 你和任何乙個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何乙個陌生人。如圖1所示。圖1 六度空間示意圖 假如給你乙個社交網路圖,請你對每個節點計算符合 六度...
六度空間 MOOC浙大資料結構
include include include include define max 10001 using namespace std int matgra max max int visit max 根據變數動態建立一維陣列 int bfs int node,int n if tmpnode l...
7 7 六度空間
六度空間 理論又稱作 六度分隔 six degrees of separation 理論。這個理論可以通俗地闡述為 你和任何乙個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何乙個陌生人。如圖1所示。圖1 六度空間示意圖 假如給你乙個社交網路圖,請你對每個節點計算符合 六度...