1. 程式人生 > >【圖(上)】六度空間

【圖(上)】六度空間

六度空間(Six Degrees of Separation)

  • 你和任何一個陌生人之間所間隔的人不會超過六個
    在這裡插入圖片描述

題目:給定社交網路圖,請對每個節點計算符合“六度空間”理論的結點佔結點總數的百分比

演算法思路:

  • 對每個節點,進行廣度優先搜尋
  • 搜尋過程中累計訪問的節點數
  • 需要記錄“層”數,僅計算6層以內的節點數

具體過程:
對每一個結點求其6層以內可以訪問的結點的總數,除以總數n就是該節點符合“六度空間”理論的結點佔結點總數的百分比

變數level表示層數,last表示該層訪問的最後一個結點,根節點入佇列,last初始化為根節點,從佇列中取元素,並將該元素相連的沒有訪問過的元素入佇列,所有入棧的元素都要設定成已經訪問過;當取出的元素等於last時,表示該層訪問完了

,層數加1,進入下一層,直到第六層訪問完時,退出,返回入棧的元素總數。
在這裡插入圖片描述

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; }