拓撲排序首先針對的是有向無環圖,其主要的目的是將乙個有向圖變為乙個線性序列,就像任務排序那樣的感覺。對於任何任務,必然先要完成其先導任務,對於同等級的任務,就可以隨意進行排序處理,當是乙個正常可完成的無環圖,必然可以使得生成乙個同節點個數的線性序列;
對於拓撲排序,核心的步驟要借助佇列進行;
首先,根據我們的觀察,乙個可以進行拓撲排序的圖必然存在入度為0的點,這也是我們必須要先進行處理的點。第一步就是將這些入度為0的點打進佇列;
將佇列中的點進行處理,處理乙個出隊乙個,當我們完成乙個點的時候,有可能後繼的節點也可以進行處理,所以這裡處理完乙個節點,就將後繼的節點進行入度-1,當有乙個後繼節點入度變為0,就說明可以進行處理,加入佇列;
重複的進行上述操作,直至佇列內為空。
大致**如下,不難理解:
其中值得注意的是我們維護了乙個indegree佇列,來進行每個節點入度的值,作為判斷是否入佇列的條件;
vectorg[maxv];
int n,m,indegree[maxv];
bool topologicalsort()
}while(!.empty())
}g[u].clear();
num++;
}if(num==n)
return true;
else
return false;
}
關於SpringIOC的一些個人理解
根據上面這個思路接著說的話,那就順理成章了,首先spring容器將所有的bean都放在一起進行管理,然後當某個應喲經程式需要用到某個bean物件的時候,說一下,然後spring自動給這個程式分配他所需要的物件。這就是所謂的控制反轉了吧?本來這個宣告建立bean物件的過程應該由程式自己進行,建立呼叫然...
關於git命令一些個人理解
對於git reset hard 版本號 如果工作區新增了乙個檔案,那個檔案不會被刪除,因為沒有add過,不能對它追蹤。同樣,假如工作區新增了新檔案,如果git reset 版本號 再git checkout 新檔名 是會報錯的,也是沒有追蹤那個新檔案。這個時候如果git status,會顯示有新檔...
關於KMP演算法的一些個人理解
kmp演算法其實理解起來也不難,只不過很多過於公式化的講解以及太過晦澀的說法會讓人一頭霧水 kmp演算法主要是判斷乙個字串是否是另乙個字串的字串 對於這兩個字串,在演算法描述中有固定的稱謂 我們把最長的字串稱為text,需要判定的子串稱為模式pattern 對於這個問題,其實最容易想到的就是暴力列舉...