【圖(上)】六度空間
阿新 • • 發佈:2018-11-22
六度空間(Six Degrees of Separation)
- 你和任何一個陌生人之間所間隔的人不會超過六個
題目:給定社交網路圖,請對每個節點計算符合“六度空間”理論的結點佔結點總數的百分比
演算法思路:
- 對每個節點,進行廣度優先搜尋
- 搜尋過程中累計訪問的節點數
- 需要記錄“層”數,僅計算6層以內的節點數
具體過程:
對每一個結點求其6層以內可以訪問的結點的總數,除以總數n就是該節點符合“六度空間”理論的結點佔結點總數的百分比
變數level表示層數,last表示該層訪問的最後一個結點,根節點入佇列,last初始化為根節點,從佇列中取元素,並將該元素相連的沒有訪問過的元素入佇列,所有入棧的元素都要設定成已經訪問過;當取出的元素等於last時,表示該層訪問完了
void SDS()
{
for (each V in G)
{
count = BFS(V);
Output(count / N);
}
}
int BFS(Vertex V)
{
visited[V] = true; count = 1; //count統計6層內元素個數
level = 0; last = V; //last表示該層最後一個元素
Enqueue(V, Q);
while (!IsEmpty(Q))
{
V = Dequeue(Q);
for (V 的每個鄰接點W)
if (!visited[W])
{
visited[W] = true;
Enqueue(W, Q); count++;
tail = W;
}
if (V == last){//取出結點等於該層最後一個結點,該層元素全部已經訪問
level++; last = tail;
}
if (level == 6) break;
}
return count;
}