DS博客作业06——图
生活随笔
收集整理的這篇文章主要介紹了
DS博客作业06——图
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.本周學(xué)習(xí)總結(jié)(0--2分)
1.思維導(dǎo)圖
2.談?wù)勀銓?duì)圖結(jié)構(gòu)的認(rèn)識(shí)及學(xué)習(xí)體會(huì)。
這章學(xué)習(xí)了圖,學(xué)習(xí)了圖的兩種存儲(chǔ)結(jié)構(gòu):鄰接矩陣和鄰接表。這兩種存儲(chǔ)結(jié)構(gòu)都用到了之前學(xué)c時(shí)學(xué)到的結(jié)構(gòu)體,將結(jié)構(gòu)體充分運(yùn)用。知道了圖的兩種遍歷方法:深度優(yōu)先遍歷(DFS)和廣度優(yōu)先遍歷(BFS)。深度優(yōu)先遍歷是一個(gè)對(duì)每個(gè)結(jié)點(diǎn)查找其鄰接點(diǎn)的過程,而廣度優(yōu)先遍歷則搜索了所有節(jié)點(diǎn)。 通過學(xué)習(xí)Prim算法和Kruskal算法,解決了最小生成樹問題。在學(xué)習(xí)Prim算法的同時(shí),還提到了貪心算法,之前學(xué)習(xí)的貪心算法只能解決局部最優(yōu)的問題,所以最小生成樹的問題不可以用貪心算法來做。 學(xué)習(xí)最短路徑時(shí),先學(xué)的Dijstra算法,但是Dijstra算法存在只能解決最短路徑,而不能解決最長路徑的問題,由此引進(jìn)了Floyd算法,在滿足最小路徑查找的同時(shí)也能滿足最長路徑的查找。 拓?fù)渑判蚝完P(guān)鍵路徑都是對(duì)有向無環(huán)圖的操作。拓?fù)渑判蚩梢杂脕砼袛嘁粋€(gè)有向圖是否有環(huán),還可以解決教學(xué)系統(tǒng)中的排課問題;關(guān)鍵路徑則是用來解決最短工時(shí)的問題。2.PTA實(shí)驗(yàn)作業(yè)(6分)
2.1.7-1 圖著色問題
圖著色問題是一個(gè)著名的NP完全問題。給定無向圖G=(V,E),問可否用K種顏色為V中的每一個(gè)頂點(diǎn)分配一種顏色,使得不會(huì)有兩個(gè)相鄰頂點(diǎn)具有同一種顏色? 但本題并不是要你解決這個(gè)著色問題,而是對(duì)給定的一種顏色分配,請(qǐng)你判斷這是否是圖著色問題的一個(gè)解。2.1.1設(shè)計(jì)思路(偽代碼)
//設(shè)計(jì)思路 先建一個(gè)無向圖的鄰接矩陣。在每次判斷解是否正確的過程中:先判斷使用的顏色是否為k種,是,則繼續(xù)操作,反之,輸出“No”進(jìn)入下一輪循環(huán);用雙重for循環(huán)判斷每個(gè)結(jié)點(diǎn)的臨邊顏色是否符合要求。 //偽代碼(主函數(shù)) 定義三個(gè)整型變量v、e、k、n,分別用于存放結(jié)點(diǎn)數(shù)、邊數(shù)、顏色數(shù),和 解的數(shù)量; 輸入v、e、k; 定義一個(gè)MGraph型變量G; 利用CreatMGrap函數(shù)創(chuàng)建無向圖; 輸入解的數(shù)量n; while n-- do定義int型變量:flag=1,用于控制解不正確時(shí)的情況;num數(shù)組,用于存儲(chǔ)各個(gè)結(jié)點(diǎn)的顏色;count=0,用于計(jì)算各個(gè)接中使用的顏色數(shù)量;hash數(shù)組,用于控制顏色數(shù)量的計(jì)算;for i=0 to G.n do輸入num[i];if hash[num[i]]等于0 then //num[i]顏色沒出現(xiàn)過時(shí)hash[num[i]]++;count++;end ifend forif count的值與k不相等時(shí) then輸出“No”continue進(jìn)入下一輪循環(huán)end iffor i=0 to G.n dofor j=i to G.n do //無向圖的鄰接矩陣關(guān)于對(duì)角線對(duì)稱,所以只要判斷半個(gè)鄰接矩陣if i與j不相等 thenif i與j結(jié)點(diǎn)的顏色相同 且 i與j結(jié)點(diǎn)間有邊 then輸出“No”flag=0breakend ifend ifend forif flag=0 thenbreakend ifend forif flag=1 then輸出“Yes”end if end while2.1.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)
2.1.3本題PTA提交列表說明。
- Q1:第一次提交,是把判斷解是否正確的那一部分寫成一個(gè)函數(shù)的,結(jié)果提交上去顯示答案錯(cuò)誤。當(dāng)時(shí)以為我的函數(shù)有什么問題,就把函數(shù)拆了,直接寫到主函數(shù)里頭,結(jié)果還是答案錯(cuò)誤。
- A1:我想著代碼沒問題啊,調(diào)試也沒毛病,突然,想到答案錯(cuò)誤還有一種情況:輸出的問題,看一眼題目要求,好吧,yes和no的首字母要大寫,我沒大寫。
- Q2:然后,改完以后,部分正確,還有兩分不知道錯(cuò)在哪,提示的是有小于k種顏色的情況錯(cuò)誤。
- A2:當(dāng)時(shí)在想,我的做法小于k種顏色的情況也可以正確判斷啊,為什么會(huì)顯示這個(gè)錯(cuò)誤。當(dāng)時(shí)舍友在一邊,我就問她著色的時(shí)候可不可以不用到k種顏色這么多。她說,當(dāng)然可以啊。然后,我就很納悶,到底哪兒錯(cuò)了。后來抱著試一試的心態(tài),將使用的顏色小于k的情況也當(dāng)走是錯(cuò)的,結(jié)果就過了。
2.2 7-6 修建道路
N個(gè)村莊,從1到N編號(hào),現(xiàn)在請(qǐng)您興建一些路使得任何兩個(gè)村莊彼此連通。我們稱村莊A和B是連通的,當(dāng)且僅當(dāng)在A和B之間存在一條路,或者存在一個(gè)存在C,使得A和C之間有一條路,并且C和B是連通的。 已知在一些村莊之間已經(jīng)有了一些路,您的工作是再興建一些路,使得所有的村莊都是連通的,并且興建的路的長度是最小的。2.2.1設(shè)計(jì)思路(偽代碼)
//偽代碼(Prim函數(shù)) 定義一個(gè)int型數(shù)組lowcost[],變量MIN用于存放最小值,v,賦初值為1,cost用于計(jì)算花費(fèi),賦初值為0; 定義一個(gè)int型數(shù)組closest[],用于存放最近的結(jié)點(diǎn),變量i,j,k,用于循環(huán)中 定義一個(gè)ArcNode型變量p 將0賦值給lowcost[v] for i=2 to 圖的節(jié)點(diǎn)數(shù) dolowcost[i]=10000001 //賦初值,令數(shù)組的初值最大 end for 將G->adjlist[v].firstarc的值賦給p while p不為空 do將p->weight的值賦給lowcost[p->adjvex]將v的值賦給closest[p->adjvex]令p等于p指向的下一個(gè)結(jié)點(diǎn) end while for i =1 to 圖的節(jié)點(diǎn)數(shù) do賦初值1000000給MINfor j=1 to 圖的結(jié)點(diǎn)數(shù) doif lowcost[j]不等于-1 且 小于MIN then將 lowcost[j]的值賦給MIN將j的值賦給kend ifend for將MIN的值累加給costlowcost[k]=-1將G->adjlist[k].firstarc的值賦給pwhile p不為空 doif p->weight小于lowcost[p->adjvex] 且 lowcost[p->adjvex]不等于-1 then將p->weight的值賦給lowcost[p->adjvex]將k的值賦給closest[p->adjvex]end if令p等于p指向的下一個(gè)結(jié)點(diǎn)end while end while 輸出cost2.2.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)
2.2.3本題PTA提交列表說明。
- Q1:這題答案錯(cuò)誤,一開始沒發(fā)現(xiàn)什么毛病,該賦值的也賦值了,后來無意間發(fā)現(xiàn),好吧,賦初值的位置放錯(cuò)了。
A1:改過來之后就對(duì)了。
2.3 7-7 旅游規(guī)劃
2.3.1設(shè)計(jì)思路(偽代碼)
//偽代碼(Dijkstra函數(shù)) 定義int型變量v,i,MIN1,MIN2 定義ArcNode型變量p 定義int型數(shù)組dist1[1000]、path[1000]、dist2[1000] 定義一個(gè)int型靜態(tài)局部變量數(shù)組visted[1000] for i=0 to 圖的節(jié)點(diǎn)數(shù) dodist1[i]=100000dist2[i]=100000path[i]=-1 end for 將Begin的值賦給v 將0分別賦給dist1[v]和dist2[v],將v賦給path[v] while 1 do將100000分別賦給MIN1和MIN2for i=0 to 圖的結(jié)點(diǎn)數(shù) doif dist1[i]的值小于MIN1 且 visted不等于1 thenif dist1[i]的值小于MIN1 或者 dist2[i]的值小于MIN2 then將dist1[i]的值賦給MIN1將dist2[i]的值賦給MIN2將i的值賦給vend ifend ifend forif v等于END then退出循環(huán)end ifvisted[v]=1將G->adjlist[v].firstarc的值賦給pwhile p不為空時(shí) doif p->length與diat1[v]的和 小于等于 dist1[p->adjvex] thenif p->length與diat1[v]的和 小于 dist1[p->adjvex] 或者 p->price與diat2[v]的和 小于 dist2[p->adjvex] then將p->length與diat1[v]的和賦給dist1[p->adjvex]將p->price與diat2[v]的和 賦給dist2[p->adjvex]將v的值賦給path[p->adjvex]end ifend if p等于p指向的下一個(gè)結(jié)點(diǎn)end while end while 輸出dist1[v]和dist2[v]的值2.3.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)
2.3.3本題PTA提交列表說明。
這題主要是關(guān)于迪杰斯特拉算法的一個(gè)應(yīng)用。代碼基本都是照著書上的代碼修修改改完成的。然后調(diào)試什么的都在VS上完成了。
3、上機(jī)考試錯(cuò)題及處理辦法(-2--2分)
當(dāng)時(shí)上機(jī)考試的時(shí)候,因?yàn)闀r(shí)間問題和對(duì)這章知識(shí)的不熟悉,只做了兩道題(兩道題都做出來了)。當(dāng)時(shí)還剩幾分鐘的時(shí)候看了一下六度空間的題目,當(dāng)時(shí)代碼打了一半半時(shí)間就到了,就沒打完,就把回來后打的代碼貼上來。
轉(zhuǎn)載于:https://www.cnblogs.com/Lay-549/p/10964528.html
總結(jié)
以上是生活随笔為你收集整理的DS博客作业06——图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ ‘-DNODE_GYP_MODU
- 下一篇: 8月26日计算机视觉理论学习笔记——医疗