DS博客做業06--圖

1.本週學習總結

1.1思惟導圖

1.2談談你對圖結構的認識及學習體會。

圖是個多對多的結構,能夠用鄰接矩陣或者鄰接表來儲存
圖的遍歷分爲深度優先遍歷和廣度優先遍歷,它們分別適合不一樣的問題,例如着色問題適合用深度優先遍歷,六度空間適合廣度優先遍歷
求圖的最小生成樹能夠用普里姆算法或者克魯斯卡爾算法
求圖的最短路徑能夠用迪傑斯特拉算法或者費洛伊德算法
這些代碼書上都有,我以爲代碼應該要理解的記,不要去死記硬背
圖的拓撲排序是對有前後順序的事件的完成順序的排序,它是個有向無環圖

2.PTA實驗做業

2.1.題目1:圖着色問題

2.1.1設計思路(僞代碼)

由於顏色的數目是固定而且可能有重複的的,因此可使用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

2.1.2代碼截圖


2.1.3本題PTA提交列表說明

Q1:這題瘋狂試探,老是部分正確,一開始是最小圖錯誤,不是很理解最小圖是指什麼
A1:而後將數組的下標改了從0開始,就出現了其它的錯誤
A2:後來又去回顧代碼,發現個人judge函數裏沒有寫返回true,只有返回false,這麼一個小錯誤,讓我瘋狂試探了那麼屢次,自閉了

2.2 題目2:公路村村通

2.2.1設計思路(僞代碼)

這題至關於求最小生成樹
用的是克魯斯卡爾算法,而且採用了並查集直接進行通量的合併,以及庫函數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

2.2.2代碼截圖



2.2.3本題PTA提交列表說明

Q1:這題上機考的題集裏也有出現,就是求最小生成樹,考試時並無寫出來,老師提示用最短路徑的代碼而後加上prim算法就能夠了
A1:可是我連prim算法都不會敲(那會還不會),因而就沒寫了
A2:後來看書寫代碼,用的是克魯斯卡爾算法基本上是看書的,而後並查集不是很懂就上百度了

2.3 題目3:旅遊規劃

2.3.1設計思路(僞代碼)

定義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;

2.3.2代碼截圖


2.3.3本題PTA提交列表說明

A1:這題至關於求最短路徑,我用的是費洛伊德算法,三層循環簡單粗暴,先判斷距離哪一個比較近再判斷價格

3.上機考試錯題及處理辦法

3.1.1截圖錯題代碼

六度空間

3.1.2 錯的緣由及處理方法

上機考時也沒寫幾道題,除了函數題,就提交了這個編程題,這是那題六度空間的題目
老師上課有講過這題用廣搜就能夠作了,可是顯然我仍是不是很懂,因此去看了大佬的博客
這題的思路和着色問題有點像,也是用vector容器,存了每一個頂點所鏈接的點,而後用隊列也就是廣搜,將沒訪問到的進行訪問並放進set容器裏,進行六次的循環,最後對set取長度就能夠得出與該結點距離不超過6的結點數了
當時考試前瘋狂記代碼,而後一會兒記了好幾個,到考試時就都記混了,自閉了,最後也沒能把這題代碼正確打出來,歸根結底仍是對代碼的理解不透徹,只想着背背代碼混個考試,不可以啊
考試結束後看了正確的代碼,我離它的差距就是最外層的那個六次的循環,我寫成了while(q.size()),就只對了一個測試點,鬼知道我在想這些什麼

3.2.1截圖錯題代碼

拓撲排序

3.2.2錯的緣由及處理方法

拓撲排序思路挺簡單的,計算每一個結點的入度,將入度爲0的結點放進數組中,而後將度爲0的結點標記,並將所連的結點的入度減一
我感受個人代碼沒得毛病,可是在dev運行,運行不太起來,提交後發現是段錯誤,這誰頂得住啊,還沒找到vs
到最後仍是沒看出哪裏有毛病,結束後,對比了一下正確的代碼,發現就一個下標的錯誤,將index改爲top就對了,我還一直往是否是越界了的方向想,壓根沒在乎這個地方
果真細節纔是魔鬼
相關文章
相關標籤/搜索