1.本周學習總結
1.1思維導圖
1.2學習體會
本章學習了圖,圖的定義,圖的存儲結構,圖的遍歷以及最小生成樹,最短路徑,拓撲排序等算法,學習圖的存儲結構比較容易,但在學習普里姆最小生成樹和狄克斯特最短路徑時花費的時間較多,對於這種復雜的算法,需要慢慢地理解其思路然后再學習代碼的寫法。
2.PTA實驗作業
2.1 題目1:7-1 圖着色問題
2.1.1設計思路
建立鄰接矩陣g
將顏色存入到數組a[]中
for i=1 to i=n
for j=1 to j=n
if(if(a[i]==a[j]&&g[i][j]==1) flag=0 //對於每一個條邊g[i][j],其兩個頂點的顏色分別位a[i]和a[j],若有a[i]=a[j],則可判斷不滿足條件
2.1.2代碼截圖
2.1.3本題PTA提交列表說明
1.部分正確是因為沒注意題目要求顏色數要等於輸出的顏色數N
2.所以后面加了c[]數組判斷顏色數
2.2 題目2:7-3 六度空間
2.2.1 設計思路
建立鄰接表g
用廣度遍歷的方法遍歷g
visited[]數組來判斷結點時否被訪問過,訪問過就為1,否則為0
定義(int) temp,tail,last=x三個變量,x是參數,該函數作用是“輸出與x結點距離不超過6的結點數”,第一層的最后一個結點就是x,所以laxt=x
定義(int) sum 變量用於儲存與x結點距離不超過6的結點數
queue<int> q;//新建一個隊列q
q.push(x)//先將x放入隊列中
visited[x]=0;
while(!q.enmpty())//當q不為空時
{
temp=q.front();
p訪問q中隊頭所對應的鄰接表結點
q.pop();
while(p!=NULL)
{
如果p未被訪問 {入隊,sum++,visited[(p->adjvex)]=1,tail=p->adjvex//這樣子當訪問到最后該層的最后一個結點時,tail儲存的會是下一層最后一個結點的位置 }
p=p->nextarc //p訪問p的下一個鄰接點
}
if(temp=last) {level++;last=tail //tail此時找到了下一層結點的最后一個元素位置,將其值給last}
}
結果return sum
2.2.2 代碼截圖
2.2.3本題PTA提交列表說明
1.一開始的算法思路不對,導致只能過一個測試點,后來去問到了這種判斷層次的思路才過了所有測試點
2.編譯錯誤就是用了c提交,為什么會這樣我也不知道
2.3 題目3:7-6 修建道路
2.3.1 設計思路
建立鄰接矩陣g
將已經連通的道路的價格g.price[i][j]變成0;
最后用普里姆算法即可計算最少花費(普里姆算法這里就不詳細解說)
2.3.2 代碼截圖
2.3.3本題PTA提交列表說明
1.一開始的思路是把已經連通的路的頂點放入v集合中,然后再計算最少消費。但是后來發現這樣做的話v集合中的頂點不一定個個連通,也就是v集合不一定連通,導致后面全錯
2.后來在別人指導下,把已經連通的路的修路費用改成0,然后再用普里姆算法計算最少消費
3、上機考試錯題及處理辦法
3.1 6-2 jmu-ds-圖鄰接表操作錯誤代碼
錯誤代碼
改正后得到代碼
錯誤就錯在這里
少了G->n=n;
G->e=e;
由於本人比較偏向完美主義,做不過的題目不想跳過。所以只寫了 第一題最短路徑,卡在第二題卡了一節課,考試結束后通過和練習比對發現只是少了G->n=n;G->e=e;兩行代碼,(但是考試的時候我通過調試發現的卻是visited在第二次運行函數是沒有初始化導致的,雖然主函數已經有for(i=1;i<=G->n;i++) visited[i]=0這個語句,但是我在隨后運行的BFS()函數中查了一下visited[]的值全部輸出1,但是出去比對以后發現是少了G->n=n;G->e=e,但是為什么導致我考試時候遇見的問題我也沒有深究),改正后可以通過。而后面的六度空間等題目在上面我也詳細地講過了,這里就不再寫一遍了