算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_第1頁
算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_第2頁
算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_第3頁
算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_第4頁
算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告題目:拓?fù)渑判蛟?(系): 計算機科學(xué)與工程學(xué)院 專 業(yè): 計算機科學(xué)與技術(shù) 班 級: 學(xué) 生: 學(xué) 號: 302 指導(dǎo)教師: 2010年 12 月1. 問題描述 圖不同于線性結(jié)構(gòu),也不同于樹形結(jié)構(gòu),圖包含若干個頂點,且其中任何兩個頂點都可能存在鄰接關(guān)系,這種關(guān)系用邊或弧表示,圖在存儲結(jié)構(gòu)主要有兩種:鄰接矩陣和鄰接表,進行拓?fù)渑判虻姆椒ㄈ缦拢?) 在圖中選一個沒有直接前驅(qū)(入度為0)的頂點, 并把該頂點輸出,令 n 為頂點個數(shù);2) 從圖中刪去該頂點, 同時刪去所有它發(fā)出的有向邊;3) 重復(fù)以上(1)、(2)步, 直到全部頂點均已輸出,拓?fù)溆行蛐蛄行纬?,拓?fù)渑判蛲瓿桑?/p>

2、若圖中還有未輸出的頂點,但已跳出處理循環(huán)。這說明圖中還剩下一些頂點,它們都有直接前驅(qū),再也找不到?jīng)]有前驅(qū)的頂點了,這時aov網(wǎng)絡(luò)中必定存在有向環(huán)。2. 算法設(shè)計一、拓?fù)渑判蛟O(shè)計思想 在拓?fù)渑判虻倪^程之中,輸入入度為零(即沒有前趨)的頂點,同時將該頂點的直接后繼的入度減1。(1)、查鄰接矩陣中入度為零的頂點,并進棧。(2)、當(dāng)棧為空時,進行拓?fù)渑判?。(a)、退棧,輸出棧頂元素v。(b)、在鄰接矩陣中查找vj的直接后繼vk,將vk的入度減1,并令入度減至零的頂點進棧。(3)、若??諘r輸出的頂點數(shù)不是n個則說明有向回路,否則拓?fù)渑判蚪Y(jié)束。二、拓?fù)渑判虿捎玫臄?shù)據(jù)結(jié)構(gòu)設(shè)g=(v,e)是具有n個頂點的圖,

3、則g的鄰接矩陣是具有如下性質(zhì)的n階方陣: (1)對于n個頂點的無向圖,有a(i,i)=0,1in。(2)無向圖的鄰接矩陣是對稱的,即a(i,j)=a(j,i),1in,1jn。(3)有向圖的鄰接矩陣不一定對稱的。因此用鄰接矩陣來表示一個具有n個頂點的有向圖時需要n2個單位來存儲鄰接矩陣;對有n個頂點的無向圖則需存入上(下)三角形,故只需n(n+1)/2個單位。(4)無向圖的鄰接矩陣的第i行(或第i列)非零元素的個數(shù)正好是第i個頂點的度td(vi)。(5)有向圖的鄰接矩陣的第i行(或第i列)非零元素的個數(shù)正好是第i個頂點的出度od(vi)。3. 算法實現(xiàn)一、開發(fā)環(huán)境操作系統(tǒng)編譯環(huán)境生成文件win

4、dows xpmyeclipse 7.0node.javatopologysort.javatesttopology.javawindows vistamicrosoft visiotopologysort.vsd二、拓?fù)渑判蛩惴鞒虉D三、源程序清單1. node.javapackage com.xatu.topologysort;/* * * author * */public class node public string label;public boolean wasvisited;public node(string label) this.label = label;this.w

5、asvisited = false;public string getlabel() return label;public void setlabel(string label) this.label = label;public boolean iswasvisited() return wasvisited;public void setwasvisited(boolean wasvisited) this.wasvisited = wasvisited;2. topologysort.javapackage com.xatu.topologysort;import java.util.

6、scanner;/* * 用鄰接矩陣實現(xiàn)拓?fù)渑判蛩惴?* * author * */public class topologysort private int nodenum = 0;private node nodelist; / 圖中的所有頂點private int adjmat; / 鄰接矩陣private int indegree;/ 每個頂點入度的數(shù)組private int outdegree;/ 每個頂點出度的數(shù)組private int nverts; / 實際頂點數(shù)private string sortedarray; / 拓?fù)渑判蛴胮ublic int getnodenum()

7、 return nodenum;public void setnodenum(int nodenum) this.nodenum = nodenum;public node getnodelist() return nodelist;public void setnodelist(node nodelist) nodelist = nodelist;public int getadjmat() return adjmat;public void setadjmat(int adjmat) this.adjmat = adjmat;public int getindegree() return

8、indegree;public void setindegree(int indegree) this.indegree = indegree;public int getoutdegree() return outdegree;public void setoutdegree(int outdegree) this.outdegree = outdegree;public int getnverts() return nverts;public void setnverts(int verts) nverts = verts;public string getsortedarray() re

9、turn sortedarray;public void setsortedarray(string sortedarray) this.sortedarray = sortedarray;public topologysort() scanner scan = new scanner(system.in);system.out.println(請輸入頂點的個數(shù):);nodenum = scan.nextint();nodelist = new nodenodenum;adjmat = new intnodenumnodenum;sortedarray = new stringnodenum;

10、indegree = new intnodenum;outdegree = new intnodenum;nverts = 0;/ 當(dāng)前頂點個數(shù)/ 初始化鄰接矩陣for (int i = 0; i nodenum; i+)for (int j = 0; j nodenum; j+) adjmatij = 0;/* * 添加頂點 * * param label */public void addnode(string label) nodelistnverts+ = new node(label);/* * 添加邊 * * param start * param end */public voi

11、d addedge(int start, int end) adjmatstart - 1end - 1 = 1;/* * 查看頂點v的鄰接點是否已經(jīng)全部訪問 * * param v * return */public int getadjunvisitedvertex(int v) for (int i = 1; i 0) int v = nosuccessors();if (v = -1) system.out.println(nn該有向圖有回路!);return;sortedarraynverts - 1 = nodelistv.label;deletevertex(v); / 刪除沒有

12、后繼的節(jié)點/ 輸出結(jié)果system.out.println(nn拓?fù)渑判蛴行蛐蛄袨椋?;for (int i = 0; i temp; i+) system.out.print(t + sortedarrayi);/* * 計算每個頂點的入度 */public void calculateindegree() int sumindegree = new intnodenum;for (int i = 0; i nodenum; i+) for (int j = 0; j nodenum; j+) if (adjmatji = 1) sumindegreei+; else continue;th

13、is.setindegree(sumindegree);/* * * 計算每個頂點的出度 */public void calcalateoutdegree() int sumoutdegree = new intnodenum;for (int i = 0; i nodenum; i+) for (int j = 0; j nodenum; j+) if (adjmatij = 1) sumoutdegreei+; else continue;this.setoutdegree(sumoutdegree);/* * 返回一個沒有后繼的頂點 * * return */public int nos

14、uccessors() for (int row = 0; row nverts; row+) boolean hassuccessor = false;for (int col = 0; col 0) hassuccessor = true;break;if (!hassuccessor) return row;return -1;/* * 刪除沒有后繼的頂點,并修改鄰接矩陣 * * param v */public void deletevertex(int v) if (v != nverts - 1) / 不是最后一個頂點才做如下操作for (int i = v; i nverts -

15、 1; i+) / 從數(shù)組中刪除已經(jīng)拓?fù)渑藕眯虻墓?jié)點nodelisti = nodelisti + 1;for (int i = v; i nverts - 1; i+) / 修改鄰接矩陣行moverowup(i, nverts);for (int i = v; i nverts - 1; i+) / 修改鄰接矩陣列movecolleft(i, nverts - 1);nverts-;/* * 把刪除頂點以下的所有元素上移一行 * * param row * param n */public void moverowup(int row, int n) for (int col = 0; co

16、l n; col+) adjmatrowcol = adjmatrow + 1col;/* * 把刪除頂點右邊的所有元素左移一列 * * param col * param n */public void movecolleft(int col, int n) for (int row = 0; row n; row+) adjmatrowcol = adjmatrowcol + 1;/* * 輸出鄰接矩陣 */public void print() this.calculateindegree();this.calcalateoutdegree();system.out.println(圖的

17、鄰接矩陣為:);system.out.print( );for (int i = 0; i nverts; i+) system.out.print( + nodelisti.label);system.out.println();for (int i = 0; i nverts; i+) system.out.print(nodelisti.label + | );for (int j = 0; j nverts; j+) system.out.print(adjmatij + );system.out.println();system.out.println(n每個頂點的入度為:);for

18、 (int i = 0; i nodenum; i+) system.out.print(tv + (i + 1);system.out.println();for (int i = 0; i nodenum; i+) system.out.print(t + this.getindegree()i);system.out.println(nn每個頂點的出度為:);for (int i = 0; i nodenum; i+) system.out.print(tv + (i + 1);system.out.println();for (int i = 0; i nodenum; i+) sys

19、tem.out.print(t + this.getoutdegree()i);3.testtopology.javapackage com.xatu.topologysort;public class testtopology public static void main(string args) topologysort ts = new topologysort();for(int i=0;its.getnodenum();i+)ts.addnode(v+(i+1);/ts.addnode(1);/ts.addnode(2);/ts.addnode(3);/ts.addnode(4);/ts.addnode(5);/ts.addnode(6);ts.addedge(1, 2);/ts.addedge(2, 1); /設(shè)置一個環(huán)的實驗/ts.addedge(6, 6); /設(shè)置一個自身環(huán)的實驗ts.addedge(1, 3);ts.addedge(1, 4);ts.addedge(3, 2);ts.addedge(3, 5);ts.a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論