想了很多,打算決定每天都在這個上面加一點自己當天學到的,還有自己思考的東西,一點一點加,或許會更有效率,也會記錄我的思考過程吧。
5.12
今天做了PTA上的選擇題
1、用一維數組G[]
存儲有4個頂點的無向圖如下:
G[] = { 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 }
推出:則頂點2和頂點0之間是有邊的。
2、如果用鄰接表存儲結構,在對圖進行廣度優先遍歷時一般要用到的一種數據結構類型是--隊列
3、給定有權無向圖的鄰接矩陣如下,其最小生成樹的總權重是:8
4、如果G是一個有15條邊的非連通無向圖,那么該圖頂點個數最少7---n(n-1)*1/2 + 1
圖的遍歷:
深度優先
類似於樹的先序遍歷
直到剛訪問的頂點沒有未被訪問的頂點為止。
算法實現(遍歷連通圖):

1 bool visited[MVNum]; //訪問標志數組,其初值為“false” 2 void DFS(Graph G, int v) 3 {//從第v個頂點出發遞歸地深度優先遍歷圖G 4 cout<<v; visited[v] = ture; 5 for(w=FirstAdjVex(G,v);w>=0;w=NexAdjVex(G,v,x)) 6 //依次檢查v的所有鄰接點,First...表示v的第一個鄰接點 7 //Nex...表示v相對於w的下一個鄰接點,w>=0表示存在鄰接點 8 if(!visited[w]) DFS(G,w); 9 10 }
(非連通圖)

void DFSTraverse(Graph G) {//對非連通圖G做深度優先遍歷 for(v=0;v<G.vexnum;++v) visited[v]=false;//訪問標志數組初始化 for(v=0;v<G.Vexnum;++v) //循環調用遍歷連通圖算法 if(!visited[v]) DFS(G,v); //對尚未訪問的頂點調用DFS }
(鄰接矩陣)

1 void DFS_AM (AMGraph G,int v) 2 {//圖G為鄰接矩陣類型,從第v個頂點出發深度優先搜索遍歷圖G 3 cout<<v; visited[v]=true;//訪問第v個頂點,並置訪問的標志數組相應的分量值為true 4 for(w=0;w<G.vexnum;w++)//依次檢查鄰接矩陣v所在的行 5 if((G.arcs[v][w]!=0)&&(!visited[w])) DFS_AM(G,w);//G.arcs[v][w]表示w是v的鄰接點,如果w未訪問,則遞歸調用DFS_AM 6 7 8 }
(鄰接表)
廣度優先
廣度優先遍歷其實類似於一個隊列,但是分兩種(我已知):
1.先訪問,再入隊;
if(未訪問)
出隊元素的每一個鄰接點先訪問再入隊
2.直接入隊;
if(未訪問) 訪問,該點的所有鄰接點入隊
最小生成樹:
給定一個無向圖,如果它任意兩個頂點都聯通並且是一棵樹,那么我們就稱之為生成樹(Spanning Tree)。
在一個連通網的所有生成樹中,各邊的代價之和最小的那棵生成樹稱為該聯通網的最小代價生成樹,(如果是帶權值的無向圖,那么權值之和最小的生成樹)我們就稱之為最小生成樹(MST, Minimum Spanning Tree)。
常見求解最小生成樹的算法有Kruskal算法和Prim算法
Prim算法
選定一個頂點后一次根據邊的權值對點進行連接,與Kruskal算法類似,但不同之處在於,P為“加點法”,K為“加邊法”
Kruskal算法
建議還是畫圖的話,容易解決一點,相對於分成兩個集合,一個是V集合,一個是U-V集合,同時還有需要進行讀入+刷新
本周回顧:
由於上周特別忙碌,以及對樹的代碼的背誦沒有完成很好,於是對自己的emmm信心又失去了。雖然對一些代碼的知識有了些了解,比如完成書上的課后習題,但是還是有很多的問題需要改進,如今到了圖,真心開始害怕,倒不是說對分析怎么樣,但是對於打代碼開始方了,分析較打代碼要好很多,原因是只需要在需求的層面上去根據邏輯,並不需要敲代碼來實現。反正現在已經有了恐懼心理了。
新的目標:
完成本周作業,同時能夠把樹的代碼重新搞懂,理順之前的作業吧。
本周作業還沒有整理出來,雖然是要逼出來的,但是有的時候鑽到牛角尖里面去,只有可能適得其反好吧。有的話就不多說,就這樣吧。反正是不可能自閉的,就是放棄差不多吧。
第一道作業題的博客:
https://www.cnblogs.com/JeffKing11/p/10923481.html
第二道作業題的博客:
還在更新...