圖是個多對多的結構,能夠用鄰接矩陣或者鄰接表來儲存 圖的遍歷分爲深度優先遍歷和廣度優先遍歷,它們分別適合不一樣的問題,例如着色問題適合用深度優先遍歷,六度空間適合廣度優先遍歷 求圖的最小生成樹能夠用普里姆算法或者克魯斯卡爾算法 求圖的最短路徑能夠用迪傑斯特拉算法或者費洛伊德算法 這些代碼書上都有,我以爲代碼應該要理解的記,不要去死記硬背 圖的拓撲排序是對有前後順序的事件的完成順序的排序,它是個有向無環圖
由於顏色的數目是固定而且可能有重複的的,因此可使用set容器,去掉相同的數 用vector容器的二維數組將每一個頂點鏈接的頂點儲存起來 用book數組存放顏色方案裏的每一個頂點所對應的顏色,用for循環遍歷對比和該頂點相鄰的頂點顏色是否同樣
定義全局變量,n,e,colornum分別表明頂點,邊數,和顏色數量 定義int型的set容器變量s,二維數組型的vector變量vec,定義數組book,爲存放顏色方案的數組 輸入n,e,colornum 輸入兩個端點,放進vec數組中 輸入N,表明N個方案 while(N--) do s.clear();//對每一個方案的s裏的數據都清除 初始化book數組爲0 for i=1 to n do 輸入num book[i]=num//book數組存放每一個顏色 將num放入set容器s中 end for if(s.size()!=colornum)//即輸入的顏色數量與一開始輸入的所給的顏色數量不同 輸出No,繼續判斷下一個顏色方案 for i=1 to n do for j=0 to vec[i].size()-1 若是book[i]與book[vec[i][j]]相等//即相鄰的端點顏色同樣 輸出No,繼續判斷下一個顏色方案 end for 輸出Yes//即沒有上面的狀況 end while
Q1:這題瘋狂試探,老是部分正確,一開始是最小圖錯誤,不是很理解最小圖是指什麼 A1:而後將數組的下標改了從0開始,就出現了其它的錯誤 A2:後來又去回顧代碼,發現個人judge函數裏沒有寫返回true,只有返回false,這麼一個小錯誤,讓我瘋狂試探了那麼屢次,自閉了
這題至關於求最小生成樹 用的是克魯斯卡爾算法,而且採用了並查集直接進行通量的合併,以及庫函數sort根據道路的價格cost進行排序 判斷是否能通路,能夠根據最小樹的特色,邊數爲端點數-1
定義count=0,輸入城鎮數量citynum,以及道路數量roads 初始化輔助數組f 輸入兩個端點x,y和所需的費用cost 用sort對結構體進行排序 for i=0 to roads 若是x,y不是同一個集合 把最小邊加到總花費sum裏面 count++ end for 若是 count==citynum-1 輸出sum 不然輸出-1
Q1:這題上機考的題集裏也有出現,就是求最小生成樹,考試時並無寫出來,老師提示用最短路徑的代碼而後加上prim算法就能夠了 A1:可是我連prim算法都不會敲(那會還不會),因而就沒寫了 A2:後來看書寫代碼,用的是克魯斯卡爾算法基本上是看書的,而後並查集不是很懂就上百度了
定義road結構體,裏面有distance和cost兩個成員 宏定義INF爲32767 定義Road的結構體Mat[505][505] 定義citynum,roads,startcity,endcity而且輸入 初始化矩陣全部元素爲INF while roads--: 給Mat矩陣賦值 弗洛伊德算法 for k=0 to citynum-1: for i=0 to citynum-1: for j=0 to citynum-1: if 原路徑比新路徑長 更新Mat[i][j]的cost和distance else if 原路徑等於新路徑: if 原路徑消費 > 新路徑: 更新Mat[i][j]的cost和distance else 保持不變 輸出Mat[startcity][endcity].distance和Mat[startcity][endcity].cost;
A1:這題至關於求最短路徑,我用的是費洛伊德算法,三層循環簡單粗暴,先判斷距離哪一個比較近再判斷價格
六度空間
上機考時也沒寫幾道題,除了函數題,就提交了這個編程題,這是那題六度空間的題目 老師上課有講過這題用廣搜就能夠作了,可是顯然我仍是不是很懂,因此去看了大佬的博客 這題的思路和着色問題有點像,也是用vector容器,存了每一個頂點所鏈接的點,而後用隊列也就是廣搜,將沒訪問到的進行訪問並放進set容器裏,進行六次的循環,最後對set取長度就能夠得出與該結點距離不超過6的結點數了 當時考試前瘋狂記代碼,而後一會兒記了好幾個,到考試時就都記混了,自閉了,最後也沒能把這題代碼正確打出來,歸根結底仍是對代碼的理解不透徹,只想着背背代碼混個考試,不可以啊 考試結束後看了正確的代碼,我離它的差距就是最外層的那個六次的循環,我寫成了while(q.size()),就只對了一個測試點,鬼知道我在想這些什麼
拓撲排序
拓撲排序思路挺簡單的,計算每一個結點的入度,將入度爲0的結點放進數組中,而後將度爲0的結點標記,並將所連的結點的入度減一 我感受個人代碼沒得毛病,可是在dev運行,運行不太起來,提交後發現是段錯誤,這誰頂得住啊,還沒找到vs 到最後仍是沒看出哪裏有毛病,結束後,對比了一下正確的代碼,發現就一個下標的錯誤,將index改爲top就對了,我還一直往是否是越界了的方向想,壓根沒在乎這個地方 果真細節纔是魔鬼