版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)5 最小生成樹(shù)算法的設(shè)計(jì)與實(shí)現(xiàn)1、 實(shí)驗(yàn)?zāi)康?、根據(jù)算法設(shè)計(jì)需要, 掌握連通圖的靈活表示方法;2、掌握最小生成樹(shù)算法,如Prim、Kruskal算法;3、基本掌握貪心算法的一般設(shè)計(jì)方法;4、進(jìn)一步掌握集合的表示與操作算法的應(yīng)用。2、 實(shí)驗(yàn)內(nèi)容1、認(rèn)真閱讀算法設(shè)計(jì)教材和數(shù)據(jù)結(jié)構(gòu)教材內(nèi)容, 熟習(xí)連通圖的不同表示方法和最小生成樹(shù)算法;2、設(shè)計(jì)Kruskal算法實(shí)驗(yàn)程序。有n個(gè)城市可以用(n-1)條路將它們連通,求最小總路程的和。設(shè)計(jì)測(cè)試問(wèn)題,修改并調(diào)試程序, 輸出最小生成樹(shù)的各條邊, 直至正確為止。3、 Kruskal算法的原理方法邊權(quán)排序:1 3 14 6 23 6 41 4 52 3 53
2、4 52 5 61 2 63 5 65 6 61. 初始化時(shí):屬于最小生成樹(shù)的頂點(diǎn)U=不屬于最小生成樹(shù)的頂點(diǎn)V=1,2,3,4,5,62. 根據(jù)邊權(quán)排序,選出還沒(méi)有連接并且權(quán)最小的邊(1 3 1),屬于最小生成樹(shù)的頂點(diǎn)U=1,3,不屬于最小生成樹(shù)的頂點(diǎn)V=2,4,5,63. 根據(jù)邊權(quán)排序,選出還沒(méi)有連接并且權(quán)最小的邊(4 6 2),屬于最小生成樹(shù)的頂點(diǎn)U=1,3,4,6(還沒(méi)有合在一起,有兩顆子樹(shù)),不屬于最小生成樹(shù)的頂點(diǎn)V=2,54. 根據(jù)邊權(quán)排序,選出還沒(méi)有連接并且權(quán)最小的邊(3 6 4),屬于最小生成樹(shù)的頂點(diǎn)U=1,3,4,6(合在一起),不屬于最小生成樹(shù)的頂點(diǎn)V=2,55. 根據(jù)邊權(quán)排
3、序,選出還沒(méi)有連接并且權(quán)最小的邊(3 6 4),屬于最小生成樹(shù)的頂點(diǎn)U=1,2,3,4,6,,不屬于最小生成樹(shù)的頂點(diǎn)V=56. 根據(jù)邊權(quán)排序,選出還沒(méi)有連接并且權(quán)最小的邊(3 6 4),屬于最小生成樹(shù)的頂點(diǎn)U=1,2,3,4,5,6此時(shí),最小生成樹(shù)已完成4、 實(shí)驗(yàn)程序的功能模塊功能模塊:bool cmp(Edge a,Edge b); /定義比較方法int getfa(int x);/在并查集森林中找到x的祖先int same(int x,int y); /判斷祖先是否是同一個(gè),即是否聯(lián)通void merge(int x,int y); /合并子樹(shù),即聯(lián)通兩子樹(shù)sort(e+1,e+m+1,c
4、mp); /對(duì)邊按邊權(quán)進(jìn)行升序排序詳細(xì)代碼:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define MAXN_E 100000#define MAXN_V 100000using namespace std;struct Edge int fm,to,dist; /邊的起始頂點(diǎn),邊的到達(dá)頂點(diǎn),邊權(quán)eMAXN_E;int faMAXN_V,n,m; /頂點(diǎn)數(shù)組,頂點(diǎn)總數(shù),邊總數(shù)/定義比較,只是邊權(quán)比較bool cmp(Edge a,Edge
5、b) return a.dist < b.dist;/查找x的祖先int getfa(int x)/getfa是在并查集森林中找到x的祖先 if(fax=x) return fax; else return fax = getfa(fax);/判斷祖先是否是同一個(gè),即是否聯(lián)通int same(int x,int y) return getfa(x)=getfa(y);/合并兩棵樹(shù)void merge(int x,int y) int fax=getfa(x),fay=getfa(y); fafax=fay;int main()int i;cout<<"請(qǐng)輸入頂點(diǎn)數(shù)目
6、和邊數(shù)目:"<<endl; cin>>n>>m;/n為點(diǎn)數(shù),m為邊數(shù)/輸出頂點(diǎn)信息cout<<"各個(gè)頂點(diǎn)值依次為:"<<endl;for(i=0;i<n;i+)fai=i;if(i!=0)cout<<fai<<" "cout<<endl;cout<<"請(qǐng)輸入邊的信息(例子:1 4 5 從頂點(diǎn)1到頂點(diǎn)4的邊權(quán)為5)"<<endl; for(i=1;i<=m;i+)cin>>ei.fm&
7、gt;>ei.to>>ei.dist;/用邊集數(shù)組存放邊,方便排序和調(diào)用sort(e+1,e+m+1,cmp); /對(duì)邊按邊權(quán)進(jìn)行升序排序 int rst=n,ans=0;/rst表示目前的點(diǎn)共存在于多少個(gè)集合中,初始情況是每個(gè)點(diǎn)都在不同的集合中 for(i=1;i<=m && rst>1;i+) int x=ei.fm,y=ei.to; if(same(x,y) continue;/same函數(shù)是查詢(xún)兩個(gè)點(diǎn)是否在同一集合中 else merge(x,y);/merge函數(shù)用來(lái)將兩個(gè)點(diǎn)合并到同一集合中 rst-;/每次將兩個(gè)不同集合中的點(diǎn)合并,都將
8、使rst值減1 ans+=ei.dist;/這條邊是最小生成樹(shù)中的邊,將答案加上邊權(quán) cout<<ans; return 0;5、 測(cè)試數(shù)據(jù)和相應(yīng)的最小生成樹(shù)Input:6 101 2 61 3 11 4 52 3 52 5 63 4 53 5 63 6 44 6 25 6 6Putout:18生成樹(shù)為:七、思考題1、微軟面試題一個(gè)大院子里住了50戶(hù)人家,每家都養(yǎng)了一條狗,有一天他們接到通知說(shuō)院子里有狗生病了,并要求所有主人在發(fā)現(xiàn)自己家狗生病的當(dāng)天就要把狗槍殺掉。然而所有主人和他們的狗都不能夠離開(kāi)自己的房子,主人與主人之間也不能通過(guò)任何方式進(jìn)行溝通,他們能做的只是通過(guò)窗戶(hù)觀察別人家
9、的狗是否生病從而判斷自己的狗病否。(就是說(shuō),每個(gè)主人只能看出其他 49家的狗是不是生病,單獨(dú)看自己的狗是看不出來(lái)的)第一天沒(méi)有槍聲,第二天還是沒(méi)有槍聲,第三天傳出一陣槍聲,問(wèn)有多少條狗被槍殺。答:3只 假如只有一只病狗,那么當(dāng)該病狗主人第一天發(fā)現(xiàn)其他49家都是好狗時(shí)就會(huì)判斷出自己家狗是病狗,那么第一天就會(huì)有槍聲。假如有兩只病狗A和B,那么當(dāng)兩只狗主人對(duì)望時(shí),看到了對(duì)方家里是病狗,那么他們也不會(huì)判斷出自己家狗狗是否生病,當(dāng)然第一天第二天第三天以及以后都不會(huì)有槍聲。假如有三只病狗A和B和C,那么其他47個(gè)主人都會(huì)看到3只病狗,而他們?nèi)覅s互相看到兩只病狗,第一天沒(méi)有槍聲是因?yàn)锳BC三家都看到了其他的病狗,沒(méi)有判斷初自己家狗是否
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 武器操作微課程設(shè)計(jì)論文
- 2024中山市企業(yè)員工合同電子簽名應(yīng)用范本3篇
- 2025年山東濟(jì)南高新技術(shù)產(chǎn)業(yè)開(kāi)發(fā)區(qū)管理委員會(huì)公開(kāi)選聘工作人員1名歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東濟(jì)南市槐蔭區(qū)選聘鄉(xiāng)村振興工作專(zhuān)員55人歷年管理單位筆試遴選500模擬題附帶答案詳解
- 2024年度二零二四小學(xué)門(mén)衛(wèi)與學(xué)生家長(zhǎng)溝通協(xié)作聘用協(xié)議3篇
- 2025年山東棗莊學(xué)院公開(kāi)招聘工作人員50人管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東德州齊河縣衛(wèi)健系統(tǒng)事業(yè)單位第二批招聘工作人員244人管理單位筆試遴選500模擬題附帶答案詳解
- 2025年山東德州市直事業(yè)單位招聘筆試管理單位筆試遴選500模擬題附帶答案詳解
- 汽油臥式儲(chǔ)油罐課程設(shè)計(jì)
- 知識(shí)競(jìng)賽活動(dòng)方案模板合集5篇
- 車(chē)輛換行駛證委托書(shū)
- 無(wú)人機(jī)組裝調(diào)試與檢修-第六章
- 工程圖學(xué)及計(jì)算機(jī)繪圖習(xí)題集
- 人教版三年級(jí)數(shù)學(xué)上冊(cè)第七單元《長(zhǎng)方形和正方形》(大單元教學(xué)設(shè)計(jì))
- DBJ50-T-417-2022 建筑施工高處墜落防治安全技術(shù)標(biāo)準(zhǔn)
- Unit2Letscelebrate!教案-外研版高中英語(yǔ)必修第二冊(cè)
- 天津LNG外輸管道復(fù)線工程(接收站-黃驊-滄州)環(huán)評(píng)報(bào)告書(shū)(送審版)
- 機(jī)器人滾壓包邊DPCA-F12-001-2008
- 眼視光學(xué)理論與方法智慧樹(shù)知到期末考試答案章節(jié)答案2024年溫州醫(yī)科大學(xué)
- 外科學(xué) 手術(shù) 基礎(chǔ)
- 音樂(lè)鑒賞(西安交通大學(xué))智慧樹(shù)知到期末考試答案2024年
評(píng)論
0/150
提交評(píng)論