這題是廣度優先搜尋的延伸,需要額外記錄層數。一種簡單的思路是當每個結點入隊時令該結點的所在層數設定為其父節點層數+1。這種方法很好理解也實現起來比較簡單所以就不研究了。陳姥姥給出了另外一種解法,不需要在每個結點處都設定乙個記錄層數的變數,只需要乙個tail,last,level這3個變數就可以解決這個問題了可以節省的空間為o(n)。
具體實現的思路,我按照上面這個手繪的圖進行講解:
首先,先訪問頂點1,讓頂點1入隊,因為頂點1在第0層所有level=0,同時頂點1是第0層入隊的最後乙個元素所以last = 1;
然後讓頂點1出隊,按照編號從小到大訪問頂點1的每個鄰接點,每訪問乙個鄰接點就把這個鄰接點的編號賦值給tail,因此tail記錄的實際上是當前最後乙個被訪問的頂點。當頂點1的所有鄰接點訪問完畢後,發現last == 頂點1,說明第0層的入隊的所有元素都已經彈出,第0層所有入隊的元素的所有鄰接點都訪問完畢,即第1層的所有元素都已經訪問完畢,此時tail指向的是第一層的最後乙個元素(頂點7),當第一層所有元素都被訪問過後,很自然的level++表示第一層已經訪問完畢。此時不要忘記讓last = tail。因為last永遠指向當前最後乙個被訪問元素的上一層的最後乙個結點。
現在開始訪問第3層,先讓頂點2出隊,把頂點2點所有鄰接點都訪問一遍,發現頂點2 != last(頂點7),因此讓頂點3出隊,把頂點3所有鄰接點都訪問一遍,發現頂點3 != last(頂點7),繼續讓頂點4出隊... ... ... 最後讓頂點7出隊,把頂點7所有的鄰接點訪問一遍,這時候發現頂點7==last(頂點7),說明所有入隊的第1層的頂點都已經出隊且第2層的所有元素都已經被訪問過了,這時候的tail應該指向的是頂點19,此時我們讓level++,last = tail(19)。
然後開始訪問第四層,先讓頂點8出隊... ... ...
當level==6的時候,我們就不需要繼續bfs了,直接退出bfs即可。當然,這個題還要記錄6層內的頂點數,我們只要設定乙個count 變數初始化為0,在每次訪問乙個元素時count++即可。
下面是這個題的**,配合圖和講解看會更容易理解。
#include#includeusing namespace std;
#define maxv 1005
int n,g[maxv][maxv];
int bfs(int v,int vis)
} if(v==last)
if(level==6) break;
} return count;
}void sds(int v,int vis)
int main()
for(int v=1; v<=n; v++)
return 0;
}
7 7 六度空間
六度空間 理論又稱作 六度分隔 six degrees of separation 理論。這個理論可以通俗地闡述為 你和任何乙個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何乙個陌生人。如圖1所示。圖1 六度空間示意圖 假如給你乙個社交網路圖,請你對每個節點計算符合 六度...
7 1 六度空間
六度空間 理論又稱作 六度分隔 six degrees of separation 理論。這個理論可以通俗地闡述為 你和任何乙個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何乙個陌生人。如圖1所示。假如給你乙個社交網路圖,請你對每個節點計算符合 六度空間 理論的結點佔結點...
7 7 六度空間
傳送門 題目描述 假如給你乙個社交網路圖,請你對每個節點計算符合 六度空間 理論的結點佔結點總數的百分比。輸入格式 輸入第1行給出兩個正整數,分別表示社交網路圖的結點數n 1輸出格式 對每個結點輸出與該結點距離不超過6的結點數占結點總數的百分比,精確到小數點後2位。每個結節點輸出一行,格式為 結點編...