數(shù)據(jù)結(jié)構(gòu)課程設計-圖的遍歷和生成樹的求解實現(xiàn)說明書_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  *******************</p><p><b>  實踐教學</b></p><p>  *******************</p><p><b>  計算機與通信學院</b></p><p><b>  2012年春季學期</b>&

2、lt;/p><p>  算法與數(shù)據(jù)結(jié)構(gòu) 課程設計</p><p>  題 目:圖的遍歷和生成樹的求解實現(xiàn) </p><p>  專業(yè)班級:計算機科學與技術(shù) </p><p>  姓 名: *** </p><p>  學 號: 1234567 &l

3、t;/p><p>  指導教師: **** </p><p>  成 績: </p><p><b>  目 錄</b></p><p><b>  摘 要3</b></p><p><b

4、>  前 言4</b></p><p><b>  正 文5</b></p><p><b>  1.問題描述:5</b></p><p>  2.采用類c語言定義相關(guān)的數(shù)據(jù)類型5</p><p>  3.各模塊流程圖及偽碼算法6</p><p&g

5、t;  4.函數(shù)的調(diào)用關(guān)系圖8</p><p><b>  5.調(diào)試分析9</b></p><p>  1.調(diào)試中遇到的問題及對問題的解決方法9</p><p>  2.算法的時間復雜度和空間復雜度9</p><p><b>  6.測試結(jié)果10</b></p><p&

6、gt;<b>  參考文獻14</b></p><p><b>  摘 要</b></p><p>  圖是一種復雜的非線性數(shù)據(jù)結(jié)構(gòu),一個圖G(Grah)由兩個集合V和E</p><p>  構(gòu)成,圖存在兩種遍歷方式,深度優(yōu)先遍歷和廣度優(yōu)先遍歷,廣度優(yōu)先遍歷基本思路是假設從圖中某頂點U出發(fā),在訪問了頂點U之后依次訪問U

7、的各個未訪問的領(lǐng)接點,然后分別從這些領(lǐng)接點出發(fā)依次訪問他們的領(lǐng)接點,并使先訪問的頂點的領(lǐng)接點先于后訪問的頂點被訪問。直至所有領(lǐng)接點被訪問到。深度優(yōu)先的基本思路是從某個頂點出發(fā),訪問此頂點,然后依次從V的未被訪問的領(lǐng)接點出發(fā)深度優(yōu)先檢索土。直至圖中所有頂點都被訪問到。PRIM算法—KRUSKAL算法;可以對圖形進行最小生成樹的求解。</p><p><b>  主要問題是:</b></p

8、><p> ?。?)當給出一個表達式時,如何創(chuàng)建圖所表達的樹,即相應的邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)?</p><p> ?。?)表達式建立好以后,如何求出其遍歷?深度優(yōu)先和廣度優(yōu)先遍歷。</p><p>  (3)計算它的最小生成樹?主要是prim算法和kruscal算法兩種形式。</p><p><b>  前 言</b><

9、/p><p>  很多涉及圖的操作的算法都是以圖的遍歷操作為基礎,通過遍歷的演示,方便在學習中更好的理解突地遍歷的過程。</p><p>  通過對圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷的演示,分別兩種遍歷的不同與其優(yōu)缺點。</p><p>  我們在對一些問題進行求解時,會發(fā)現(xiàn)有些問題很難找到規(guī)律,或者根本無規(guī)律可尋。對于這樣的問題,可以利用計算機運算速度快的特點,先搜索查找

10、所有可能出現(xiàn)的情況,再根據(jù)題目條件從所有可能的情況中,刪除那些不符合條件的解。</p><p>  在深度優(yōu)先搜索算法中,是深度越大的結(jié)點越先得到擴展。如果在搜索中把算法改為按結(jié)點的層次進行搜索, 本層的結(jié)點沒有搜索處理完時,不能對下層結(jié)點進行處理,即深度越小的結(jié)點越先得到擴展, 也就是說先產(chǎn)生 的結(jié)點先得以擴展處理,這種搜索算法稱為廣度優(yōu)先搜索法。很多問題都可以用廣度優(yōu)先搜索進行處理,如翻幣問題、最短路徑問題等

11、。</p><p>  在計算機中,有多種方法存儲圖的信息,由于圖的結(jié)構(gòu)復雜,使用廣泛,一般應根據(jù)實際的應用,選擇適合的表示方法。常用的圖的存儲結(jié)構(gòu)有鄰接矩陣、鄰接多重表和鄰接表。</p><p>  在實際問題當中,經(jīng)常遇到這類問題,為新建的某個機構(gòu)進行選址,道路交通路線,如何走完所有路線,旅游線路等一系列問題都涉及到圖的知識。圖是一種復雜的非線性數(shù)據(jù)結(jié)構(gòu),一個圖G(Grah)由兩個集合

12、V和E。</p><p>  構(gòu)成,圖存在兩種遍歷方式,深度優(yōu)先遍歷和廣度優(yōu)先遍歷,廣度優(yōu)先遍歷基本思路是假設從圖中某頂點U出發(fā),在訪問了頂點U之后依次訪問U的各個未訪問的領(lǐng)接點,然后分別從這些領(lǐng)接點出發(fā)依次訪問他們的領(lǐng)接點,并使先訪問的頂點的領(lǐng)接點先于后訪問的頂點被訪問。直至所有領(lǐng)接點被訪問到。深度優(yōu)先的基本思路是從某個頂點出發(fā),訪問此頂點,然后依次從V的未被訪問的領(lǐng)接點出發(fā)深度優(yōu)先檢索圖。直至圖中所有頂點都被

13、訪問到。PRIM算法—KRUSKAL算法;可以對圖形進行最小生成樹的求解。</p><p>  樹型結(jié)構(gòu)是一種非線性結(jié)構(gòu),它用于描述數(shù)據(jù)元素之間層次關(guān)系,如人類社會的族譜等,樹型結(jié)構(gòu)的應用非常廣泛,磁盤文件目錄結(jié)構(gòu)就是一個典型的例子。</p><p><b>  正 文</b></p><p><b>  1.問題描述:</b

14、></p><p>  圖是一種復雜的非線性數(shù)據(jù)結(jié)構(gòu),一個圖G(Grah)由兩個集合V和E</p><p>  構(gòu)成,圖存在兩種遍歷方式,深度優(yōu)先遍歷和廣度優(yōu)先遍歷,廣度優(yōu)先遍歷基本思路是假設從圖中某頂點U出發(fā),在訪問了頂點U之后依次訪問U的各個未訪問的領(lǐng)接點,然后分別從這些領(lǐng)接點出發(fā)依次訪問他們的領(lǐng)接點,并使先訪問的頂點的領(lǐng)接點先于后訪問的頂點被訪問。直至所有領(lǐng)接點被訪問到。深度優(yōu)

15、先的基本思路是從某個頂點出發(fā),訪問此頂點,然后依次從V的未被訪問的領(lǐng)接點出發(fā)深度優(yōu)先檢索土。直至圖中所有頂點都被訪問到。PRIM算法—KRUSKAL算法;可以對圖形進行最小生成樹的求解。</p><p>  2.采用類c語言定義相關(guān)的數(shù)據(jù)類型</p><p>  #define int_max 10000 //定義鄰接矩陣最大值10000為無窮大</p><p&

16、gt;  #define max 20 //最大頂點個數(shù)</p><p>  typedef struct //開始對 鄰接表或圖進行定義</p><p><b>  {</b></p><p>  char vexs[20]; //頂點數(shù)的名稱</p><p>  Ad

17、jMatrix arcs; //鄰接矩陣 </p><p>  int vexnum,arcnum //圖中頂點數(shù)和邊數(shù)</p><p>  int creatMGraph_L(MGraph_L &G)//創(chuàng)建圖用鄰接矩陣表示</p><p>  int visited[max]; //訪問標記</p>&

18、lt;p>  typedef struct arcnode //弧結(jié)點</p><p>  int adjvex; //該弧指向的頂點的位置,即邊或弧依賴的頂點序號</p><p>  char *info; // 該弧信息</p><p>  char data; //結(jié)點信息</p>&

19、lt;p><b>  基本操作:</b></p><p>  int creatadj(algraph &gra,MGraph_L G)//用鄰接表存儲圖</p><p>  int initqueue(linkqueue &q)//初始化隊列</p><p>  int enqueue(linkqueue &q,

20、int e)//入隊</p><p>  int dequeue(linkqueue &q,int &e)//出隊</p><p>  int queueempty(linkqueue q)//判斷隊為空</p><p>  void bfstra(algraph gra)//廣度優(yōu)先遍歷</p><p>  int bfst

21、ra_fen(algraph gra)//求連通分量</p><p>  3.各模塊流程圖及偽碼算法</p><p>  int prim(int g[][max],int n) //最小生成樹PRIM算法</p><p><b>  {</b></p><p>  int lowcost[max],prevex[max

22、]; //LOWCOST[]存儲當前集合U分別到剩余結(jié)點的最短路徑</p><p>  //prevex[]存儲最短路徑在U中的結(jié)點</p><p>  int i,j,k,min; </p><p>  for(i=2;i<=n;i++) //n個頂點,n-1條邊 </p><p><b>  {</b><

23、/p><p>  lowcost[i]=g[1][i]; //初始化 </p><p>  prevex[i]=1; //頂點未加入到最小生成樹中 </p><p><b>  } </b></p><p>  lowcost[1]=0; //標志頂點1加入U集合 </p><p>  for(i=2

24、;i<=n;i++) //形成n-1條邊的生成樹 </p><p><b>  {</b></p><p><b>  min=inf; </b></p><p><b>  k=0; </b></p><p>  for(j=2;j<=n;j++) //尋找滿足邊

25、的一個頂點在U,另一個頂點在V的最小邊 </p><p>  if((lowcost[j]<min)&&(lowcost[j]!=0)) </p><p><b>  {</b></p><p>  min=lowcost[j]; </p><p><b>  k=j; </b>

26、;</p><p><b>  } </b></p><p>  printf("(%d,%d)%d\t",prevex[k]-1,k-1,min); </p><p>  lowcost[k]=0; //頂點k加入U </p><p>  for(j=2;j<=n;j++) //修改由頂點k到

27、其他頂點邊的權(quán)值 </p><p>  if(g[k][j]<lowcost[j]) </p><p><b>  {</b></p><p>  lowcost[j]=g[k][j]; </p><p>  prevex[j]=k; </p><p><b>  } </b

28、></p><p>  printf("\n"); </p><p><b>  } </b></p><p><b>  return 0;</b></p><p><b>  } </b></p><p>  int ac

29、rvisited[100];//kruscal弧標記數(shù)組</p><p>  int find(int acrvisited[],int f)</p><p><b>  {</b></p><p>  while(acrvisited[f]>0)</p><p>  f=acrvisited[f];</p&

30、gt;<p><b>  return f;</b></p><p><b>  }</b></p><p>  void kruscal_arc(MGraph_L G,algraph gra)</p><p><b>  { </b></p><p>  edg

31、 edgs[20];</p><p>  int i,j,k=0;</p><p>  for(i=0;i!=G.vexnum;++i)</p><p>  for(j=i;j!=G.vexnum;++j)</p><p><b>  {</b></p><p>  if(G.arcs[i][j]

32、.adj!=10000)</p><p><b>  {</b></p><p>  edgs[k].pre=i;</p><p>  edgs[k].bak=j;</p><p>  edgs[k].weight=G.arcs[i][j].adj;</p><p><b>  ++k;

33、</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int x,y,m,n;</p><p>  int buf,edf;</p><p>  for(i=0;i!=gra.arcnum;++i)</

34、p><p>  acrvisited[i]=0; </p><p>  for(j=0;j!=G.arcnum;++j)</p><p><b>  {</b></p><p><b>  m=10000;</b></p><p>  for(i=0;i!=G.arcnum;++

35、i)</p><p><b>  {</b></p><p>  if(edgs[i].weight<m)</p><p><b>  {</b></p><p>  m=edgs[i].weight;</p><p>  x=edgs[i].pre;</p>

36、;<p>  y=edgs[i].bak;</p><p><b>  n=i;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  // cout<<x<<y<<m;

37、</p><p>  // cout<<endl;</p><p>  buf=find(acrvisited,x);</p><p>  edf=find(acrvisited,y); </p><p>  // cout<<buf<<" "<<edf<&l

38、t;endl;</p><p>  edgs[n].weight=10000;</p><p>  if(buf!=edf)</p><p><b>  {</b></p><p>  acrvisited[buf]=edf;</p><p>  cout<<"("

39、<<x<<","<<y<<")"<<m;</p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p><

40、;b>  }</b></p><p>  4.函數(shù)的調(diào)用關(guān)系圖</p><p>  函數(shù)調(diào)用關(guān)系如圖4.1所示</p><p>  圖4.1 函數(shù)調(diào)用關(guān)系圖</p><p><b>  5.調(diào)試分析</b></p><p>  1.調(diào)試中遇到的問題及對問題的解決方法</p&

41、gt;<p>  解決Visual C++ 6.0不正確連接的問題</p><p>  明明改動了一個文件,卻要把整個項目全部重新編譯鏈接一次。剛剛鏈接好,一運行,又提示重新編譯鏈接一次。</p><p>  這是因為出現(xiàn)了未來文件(修改時間和創(chuàng)建時間比系統(tǒng)時間晚)的緣故??梢赃@樣處理:找到工程文件夾下的debug目錄,將創(chuàng)建和修改時間都比系統(tǒng)時間的文件全部刪除,然后再從新“

42、Rebuild All”一次。</p><p>  2.算法的時間復雜度和空間復雜度</p><p>  關(guān)于時間復雜度的計算是按照運算次數(shù)來進行的, 關(guān)于空間復雜度的計算是在程序運行過程所要借助的內(nèi)容空間大小。</p><p>  即:空間復雜是儲存空間的大小和變換等等決定的...</p><p>  時間復雜是邏輯比較、賦值等基本運算的次

43、數(shù)決定的...</p><p>  prim算法的時間復雜度為O(n 2),kruskcal算法的時間復雜度為O(eloge)</p><p>  prim的空間復雜度為O(n* prevex), kruskcal算法的空間復雜度為O(n)</p><p><b>  6.測試結(jié)果</b></p><p>  (1)輸

44、入圖的頂點即弧度個數(shù):</p><p>  (2)分別寫出邊的權(quán)值:</p><p>  鄰接矩陣和鄰接表創(chuàng)建成功,顯示出菜單:</p><p>  菜單選擇:輸入0,顯示鄰接矩陣</p><p>  輸出y 進行下一步操作,重新選擇菜單,輸出1顯示鄰接表:</p><p>  輸出y 進行下一步操作,重新選擇菜單,輸

45、出2顯示廣度優(yōu)先遍歷:</p><p>  輸出y 進行下一步操作,重新選擇菜單,輸出3顯示深度優(yōu)先遍歷:</p><p>  輸出y 進行下一步操作,重新選擇菜單,輸出4,顯示prim算法計算最小生成樹:</p><p>  輸出y 進行下一步操作,重新選擇菜單,輸出5,顯示kruscal算法計算最小生成樹:</p><p>  輸出y 進

46、行下一步操作,重新選擇菜單,輸出6,計算出該圖的連通分量:</p><p>  輸出n,結(jié)束操作,退出運行:</p><p><b>  設計總結(jié)</b></p><p>  在這三周的算法與數(shù)據(jù)結(jié)構(gòu)課程設計中,我的題目是:圖的遍歷和生成樹的求解實現(xiàn),這三周課程設計中,通過該題目的設計過程,我加深了對圖數(shù)據(jù)結(jié)構(gòu)及隊列的邏輯結(jié)構(gòu),存儲結(jié)構(gòu)及圖的深

47、度優(yōu)先和廣度優(yōu)先遍歷過程,Prim算法和Kruscal算法進行最小生成樹求解過程的理解,對圖數(shù)據(jù)結(jié)構(gòu)上基本運算的實現(xiàn)有所掌握,對課本中所學的各種數(shù)據(jù)結(jié)構(gòu)進一步理解和掌握,學會了如何把學到的知識用于解決實際問題,鍛煉了自己動手的能力。</p><p>  一個人要完成所有的工作是非常困難和耗時的。在以后的學習中我會更加注意各個方面的能力的協(xié)調(diào)發(fā)展。在課程設計時遇到了很多的問題,在老師的幫助,和對各種資料的查閱中,將

48、問題解決,培養(yǎng)了我自主動手,獨立研究的能力,為今后在學習工作中能更好的發(fā)展打下了堅實的基礎。</p><p>  三周的課程設計很短暫,但其間的內(nèi)容是很充實的,在其中我學習到了很多平時書本中無法學到的東西,積累了經(jīng)驗,鍛煉了自己分析問題,解決問題的能力,并學會了如何將所學的各課知識融會,組織,來配合學習,三周中我收益很 大,學到很多。</p><p><b>  致

49、 謝</b></p><p>  在本次算法與數(shù)據(jù)結(jié)構(gòu)的課程設計中,我學到了很多的東西,同時也得到了很多人的幫助和指導。在此我非常的感謝他們,感謝他們這些天對我的幫助、感謝他們對我的悉心指導。</p><p>  其次,我更要感謝我們的指導老師王旭陽老師。謝謝她這三周以來對我們的悉心指導和幫助。感謝她能在百忙中抽出時間,在機房高溫之下還非常認真的為我們做課設指導,在此,我深深

50、的感謝我的指導老師。</p><p>  最后,我還要感謝我們的學校以及學校領(lǐng)導,感謝他們能夠給我們一個這么好的鍛煉平臺,讓我們能夠?qū)ψ约核鶎W的知識充分的利用和學習,讓我的個人能力也有所提高。</p><p><b>  參考文獻</b></p><p>  1. 嚴蔚敏,吳偉民, 《數(shù)據(jù)結(jié)構(gòu)(C語言版)》,北京:清華大學出版社,2003<

51、;/p><p>  2. 嚴蔚敏,吳偉民, 《數(shù)據(jù)結(jié)構(gòu)題集(C語言版)》,北京:清華大學出版社,2005</p><p>  3. 《DATA STRUCTURE WITH C++》,William Ford,William Tcpp,北京:清華大學出版社(影印版),2005</p><p>  4. 譚浩強,《C語言程序設計》,北京:清華大學出版社,2005</

52、p><p>  附錄 原程序(帶注釋)</p><p>  #include <iostream></p><p>  #include <malloc.h></p><p>  #include<fstream></p><p>  using namespace std;</p

53、><p>  #define int_max 10000</p><p>  #define inf 9999</p><p>  #define max 20</p><p>  //…………………………………………鄰接矩陣定義……………………</p><p>  typedef struct ArcCell</p

54、><p><b>  {</b></p><p><b>  int adj;</b></p><p>  char *info;</p><p>  }ArcCell,AdjMatrix[20][20];</p><p>  typedef struct</p>

55、<p><b>  {</b></p><p>  char vexs[20];</p><p>  AdjMatrix arcs;</p><p>  int vexnum,arcnum;</p><p>  }MGraph_L;</p><p>  //^^^^^^^^^^^^^^^

56、^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</p><p>  int localvex(MGraph_L G,char v)//返回V的位置</p><p><b>  {</b></p><p><b>  int i=0;</b></p><p&g

57、t;  while(G.vexs[i]!=v)</p><p><b>  {</b></p><p><b>  ++i;</b></p><p><b>  }</b></p><p><b>  return i;</b></p>&l

58、t;p><b>  }</b></p><p>  int creatMGraph_L(MGraph_L &G)//創(chuàng)建圖用鄰接矩陣表示"\n"括號</p><p><b>  {</b></p><p>  ofstream fout("out.doc",ios::o

59、ut);</p><p>  char v1,v2;</p><p>  int i,j,w;</p><p>  cout<<"…………創(chuàng)建無向圖…………"<<endl<<"請輸入圖G頂點和弧的個數(shù):(5 7)不包括\"()\""<<endl;</p&

60、gt;<p>  cin>>G.vexnum>>G.arcnum;</p><p>  fout<<G.vexnum<<" "<<G.arcnum<<"\n";</p><p>  for(i=0;i!=G.vexnum;++i)</p><

61、p><b>  {</b></p><p>  cout<<"輸入頂點"<<i<<endl;</p><p>  cin>>G.vexs[i];</p><p>  fout<<G.vexs[i]<<" ";</p

62、><p><b>  }</b></p><p>  for(i=0;i!=G.vexnum;++i)</p><p>  for(j=0;j!=G.vexnum;++j)</p><p><b>  {</b></p><p>  G.arcs[i][j].adj=int_ma

63、x;</p><p>  G.arcs[i][j].info=NULL;</p><p><b>  }</b></p><p>  for(int k=0;k!=G.arcnum;++k)</p><p><b>  {</b></p><p>  cout<<

64、"輸入一條邊依附的頂點和權(quán):(a b 3)不包括\"()\""<<endl;</p><p>  cin>>v1>>v2>>w;//輸入一條邊依附的兩點及權(quán)值</p><p>  fout<<endl;</p><p>  fout<<v1<<

65、" "<<v2<<" "<<w;</p><p>  i=localvex(G,v1);//確定頂點V1和V2在圖中的位置</p><p>  j=localvex(G,v2);</p><p>  G.arcs[i][j].adj=w;</p><p>  G

66、.arcs[j][i].adj=w;</p><p><b>  }</b></p><p>  cout<<"圖G鄰接矩陣創(chuàng)建成功!"<<endl;</p><p>  fout.close();</p><p>  return G.vexnum;</p>&

67、lt;p><b>  }</b></p><p>  void ljjzprint(MGraph_L G)</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  for(i=0;i!=G.vexnum;++i)&

68、lt;/p><p><b>  {</b></p><p>  for(j=0;j!=G.vexnum;++j)</p><p>  cout<<G.arcs[i][j].adj<<" ";</p><p>  cout<<endl;</p><p&

69、gt;<b>  }</b></p><p><b>  }</b></p><p>  int visited[max];//訪問標記</p><p><b>  int we;</b></p><p>  typedef struct arcnode//弧結(jié)點</p&

70、gt;<p><b>  {</b></p><p>  int adjvex;//該弧指向的頂點的位置</p><p>  struct arcnode *nextarc;//弧尾相同的下一條弧</p><p>  char *info;//該弧信息</p><p><b>  }arcnode

71、;</b></p><p>  typedef struct vnode//鄰接鏈表頂點頭接點</p><p><b>  {</b></p><p>  char data;//結(jié)點信息</p><p>  arcnode *firstarc;//指向第一條依附該結(jié)點的弧的指針</p><

72、;p>  }vnode,adjlist;</p><p>  typedef struct//圖的定義</p><p><b>  {</b></p><p>  adjlist vertices[max];</p><p>  int vexnum,arcnum;</p><p><

73、b>  int kind;</b></p><p><b>  }algraph;</b></p><p>  //…………………………………………隊列定義……………………</p><p>  typedef struct qnode</p><p><b>  {</b><

74、/p><p><b>  int data;</b></p><p>  struct qnode *next;</p><p>  }qnode,*queueptr;</p><p>  typedef struct</p><p><b>  {</b></p>

75、<p>  queueptr front;</p><p>  queueptr rear;</p><p>  }linkqueue;</p><p>  //………………………………………………………………………</p><p>  typedef struct acr</p><p><b>

76、;  {</b></p><p>  int pre;//弧的一結(jié)點</p><p>  int bak;//弧另一結(jié)點</p><p>  int weight;//弧的權(quán)</p><p><b>  }edg;</b></p><p>  int creatadj(algraph

77、&gra,MGraph_L G)//用鄰接表存儲圖</p><p><b>  {</b></p><p>  int i=0,j=0;</p><p>  arcnode *arc,*tem,*p;</p><p>  for(i=0;i!=G.vexnum;++i)</p><p>&

78、lt;b>  {</b></p><p>  gra.vertices[i].data=G.vexs[i];</p><p>  gra.vertices[i].firstarc=NULL;</p><p><b>  }</b></p><p>  for(i=0;i!=G.vexnum;++i)&l

79、t;/p><p><b>  {</b></p><p>  for(j=0;j!=G.vexnum;++j)</p><p><b>  {</b></p><p>  if(gra.vertices[i].firstarc==NULL)</p><p><b>  

80、{</b></p><p>  if(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)</p><p><b>  {</b></p><p>  arc=(arcnode *)malloc(sizeof(arcnode));</p><p>  arc->

81、adjvex=j;</p><p>  gra.vertices[i].firstarc=arc;</p><p>  arc->nextarc=NULL;</p><p><b>  p=arc;</b></p><p><b>  ++j;</b></p><p>

82、  while(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)</p><p><b>  {</b></p><p>  tem=(arcnode *)malloc(sizeof(arcnode));</p><p>  tem->adjvex=j;</p><p>

83、;  gra.vertices[i].firstarc=tem;</p><p>  tem->nextarc=arc;</p><p><b>  arc=tem;</b></p><p><b>  ++j;</b></p><p><b>  }</b></p

84、><p><b>  --j;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></

85、p><p>  if(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)</p><p><b>  {</b></p><p>  arc=(arcnode *)malloc(sizeof(arcnode));</p><p>  arc->adjvex=j;</p&

86、gt;<p>  p->nextarc=arc;</p><p>  arc->nextarc=NULL;</p><p><b>  p=arc;</b></p><p><b>  }</b></p><p><b>  }</b></p&g

87、t;<p><b>  }</b></p><p><b>  }</b></p><p>  gra.vexnum=G.vexnum;</p><p>  gra.arcnum=G.arcnum;</p><p>  /*for(i=0;i!=gra.vexnum;++i)</

88、p><p><b>  {</b></p><p>  arcnode *p;</p><p>  cout<<i<<" ";</p><p>  p=gra.vertices[i].firstarc;</p><p>  while(p!=NULL)<

89、;/p><p><b>  {</b></p><p>  cout<<p->adjvex;</p><p>  p=p->nextarc;</p><p><b>  }</b></p><p>  cout<<endl;</p>

90、<p><b>  }*/</b></p><p>  cout<<"圖G鄰接表創(chuàng)建成功!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>

91、  void adjprint(algraph gra)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i!=gra.vexnum;++i)</p><p><b>  {</b></p>

92、;<p>  arcnode *p;</p><p>  cout<<i<<" ";</p><p>  p=gra.vertices[i].firstarc;</p><p>  while(p!=NULL)</p><p><b>  {</b></p&

93、gt;<p>  cout<<p->adjvex;</p><p>  p=p->nextarc;</p><p><b>  }</b></p><p>  cout<<endl;</p><p><b>  }</b></p>&l

94、t;p><b>  }</b></p><p>  int firstadjvex(algraph gra,vnode v)//返回依附頂點V的第一個點</p><p>  //即以V為尾的第一個結(jié)點</p><p><b>  {</b></p><p>  if(v.firstarc!=N

95、ULL)</p><p>  return v.firstarc->adjvex;</p><p><b>  }</b></p><p>  int nextadjvex(algraph gra,vnode v,int w)//返回依附頂點V的相對于W的下一個頂點</p><p><b>  {<

96、/b></p><p>  arcnode *p;</p><p>  p=v.firstarc;</p><p>  while(p!=NULL&&p->adjvex!=w)</p><p><b>  {</b></p><p>  p=p->nextarc;

97、</p><p><b>  }</b></p><p>  if(p->adjvex==w&&p->nextarc!=NULL)</p><p><b>  {</b></p><p>  p=p->nextarc;</p><p>  r

98、eturn p->adjvex;</p><p><b>  }</b></p><p>  if(p->adjvex==w&&p->nextarc==NULL)</p><p>  return -10;</p><p><b>  }</b></p>

99、<p>  int initqueue(linkqueue &q)//初始化隊列</p><p><b>  {</b></p><p>  q.rear=(queueptr)malloc(sizeof(qnode));</p><p>  q.front=q.rear;</p><p>  if(

100、!q.front)</p><p><b>  return 0;</b></p><p>  q.front->next=NULL;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>

101、  int enqueue(linkqueue &q,int e)//入隊</p><p><b>  {</b></p><p>  queueptr p;</p><p>  p=(queueptr)malloc(sizeof(qnode));</p><p><b>  if(!p)</b&

102、gt;</p><p><b>  return 0;</b></p><p>  p->data=e;</p><p>  p->next=NULL;</p><p>  q.rear->next=p;</p><p><b>  q.rear=p;</b>

103、;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  int dequeue(linkqueue &q,int &e)//出隊</p><p><b>  {</b></p><

104、;p>  queueptr p;</p><p>  if(q.front==q.rear)</p><p><b>  return 0;</b></p><p>  p=q.front->next;</p><p>  e=p->data;</p><p>  q.front

105、->next=p->next;</p><p>  if(q.rear==p)</p><p>  q.rear=q.front;</p><p><b>  free(p);</b></p><p><b>  return 1;</b></p><p><

106、;b>  }</b></p><p>  int queueempty(linkqueue q)//判斷隊為空</p><p><b>  {</b></p><p>  if(q.front==q.rear)</p><p><b>  return 1;</b></p&g

107、t;<p><b>  return 0;</b></p><p><b>  }</b></p><p>  void bfstra(algraph gra)//廣度優(yōu)先遍歷</p><p><b>  {</b></p><p><b>  int

108、i,e;</b></p><p>  linkqueue q;</p><p>  for(i=0;i!=gra.vexnum;++i)</p><p>  visited[i]=0;</p><p>  initqueue(q);</p><p>  for(i=0;i!=gra.vexnum;++i)&

109、lt;/p><p>  if(!visited[i])</p><p>  { visited[i]=1;</p><p>  cout<<gra.vertices[i].data;</p><p>  enqueue(q,i);</p><p>  while(!queueempty(q))</p>

110、;<p><b>  {</b></p><p>  dequeue(q,e);</p><p>  // cout<<" "<<e<<" ";</p><p>  for(we=firstadjvex(gra,gra.vertices[e]);we>

111、;=0;we=nextadjvex(gra,gra.vertices[e],we))</p><p><b>  {</b></p><p>  if(!visited[we])</p><p><b>  {</b></p><p>  visited[we]=1;</p><

112、p>  cout<<gra.vertices[we].data;</p><p>  enqueue(q,we);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&

113、lt;p><b>  }</b></p><p><b>  }</b></p><p>  int dfs(algraph gra,int i);//聲明DFS</p><p>  int dfstra(algraph gra)</p><p><b>  {</b>&

114、lt;/p><p><b>  int i,j;</b></p><p>  for(i=0;i!=gra.vexnum;++i)</p><p><b>  {</b></p><p>  visited[i]=0;</p><p><b>  }</b>

115、</p><p>  for(j=0;j!=gra.vexnum;++j)</p><p><b>  {</b></p><p>  if(visited[j]==0)</p><p>  dfs(gra,j);</p><p><b>  }</b></p>

116、<p><b>  return 0;</b></p><p><b>  }</b></p><p>  int dfs(algraph gra,int i)</p><p><b>  {</b></p><p>  visited[i]=1;</p>

117、;<p><b>  int we1;</b></p><p>  // cout<<i<<visited[i]<<endl;</p><p>  cout<<gra.vertices[i].data;</p><p>  // cout<<endl;</p>

118、<p>  for(we=firstadjvex(gra,gra.vertices[i]);we>=0;we=nextadjvex(gra,gra.vertices[i],we))</p><p><b>  {</b></p><p>  // cout<<we<<visited[we]<<endl;</

119、p><p><b>  we1=we;</b></p><p>  // cout<<nextadjvex(gra,gra.vertices[i],we)<<endl;</p><p>  if(visited[we]==0)</p><p>  // cout<<</p>

120、<p>  dfs(gra,we);//<<endl;</p><p>  // cout<<i<<we1<<endl;</p><p><b>  we=we1;</b></p><p>  // cout<<nextadjvex(gra,gra.vertices[i]

121、,we)<<endl;</p><p><b>  }</b></p><p>  return 12;</p><p><b>  }</b></p><p>  int bfstra_fen(algraph gra)//求連通分量</p><p><b&

122、gt;  {</b></p><p><b>  int i,j;</b></p><p>  for(i=0;i!=gra.vexnum;++i)</p><p><b>  {</b></p><p>  visited[i]=0;</p><p><b

123、>  }</b></p><p>  for(j=0;j!=gra.vexnum;++j)</p><p><b>  {</b></p><p>  if(visited[j]==0)</p><p><b>  {</b></p><p>  dfs(g

124、ra,j);</p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }<

125、/b></p><p>  typedef struct</p><p><b>  {</b></p><p>  int adjvex;</p><p>  int lowcost;</p><p>  }closedge;</p><p>  /*int min

126、imum(closedge *p);</p><p>  int minispantree(MGraph_L G,char u)</p><p><b>  {</b></p><p>  int k,j,i;</p><p>  closedge closedge_a[20];</p><p>

127、  k=localvex(G,u);</p><p>  // cout<<k<<endl;</p><p>  for(j=0;j!=G.vexnum;++j)</p><p><b>  {</b></p><p><b>  if(j!=k)</b></p>

128、<p><b>  {</b></p><p>  closedge_a[j].adjvex=u;</p><p>  closedge_a[j].lowcost=G.arcs[k][j].adj;</p><p><b>  }</b></p><p>  for(i=1;i!=G.

129、vexnum;++i)</p><p><b>  {</b></p><p>  k=minimum(closedge_a);</p><p><b>  cout<<k;</b></p><p>  cout<<closedge_a[k].adjvex<<&q

130、uot; "<<G.vexs[k]<<endl;</p><p>  closedge_a[k].lowcost=0;</p><p>  for(j=0;j!=G.vexnum;++j)</p><p>  if(G.arcs[k][j].adj<closedge_a[j].lowcost)</p><p

131、><b>  {</b></p><p>  closedge_a[j].adjvex=G.vexs[k];</p><p>  closedge_a[j].lowcost=G.arcs[k][j].adj;</p><p><b>  }</b></p><p><b>  }&l

132、t;/b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int minimum(closedge *p)</p><p><b&g

133、t;  {</b></p><p>  int s=10000;</p><p>  for(;p!=NULL;++p)</p><p><b>  {</b></p><p>  if(s>p->lowcost)</p><p>  s=p->lowcost;<

134、;/p><p><b>  }</b></p><p><b>  return s;</b></p><p><b>  }*/</b></p><p>  int prim(int g[][max],int n) //最小生成樹PRIM算法</p><p&g

135、t;<b>  {</b></p><p>  int lowcost[max],prevex[max]; //LOWCOST[]存儲當前集合U分別到剩余結(jié)點的最短路徑</p><p>  //prevex[]存儲最短路徑在U中的結(jié)點</p><p>  int i,j,k,min;</p><p>  for(i=2;

136、i<=n;i++) //n個頂點,n-1條邊</p><p><b>  {</b></p><p>  lowcost[i]=g[1][i]; //初始化</p><p>  prevex[i]=1; //頂點未加入到最小生成樹中</p><p><b>  }</b></p>

137、<p>  lowcost[1]=0; //標志頂點1加入U集合</p><p>  for(i=2;i<=n;i++) //形成n-1條邊的生成樹</p><p><b>  {</b></p><p><b>  min=inf;</b></p><p><b>  

138、k=0;</b></p><p>  for(j=2;j<=n;j++) //尋找滿足邊的一個頂點在U,另一個頂點在V的最小邊</p><p>  if((lowcost[j]<min)&&(lowcost[j]!=0))</p><p><b>  {</b></p><p> 

139、 min=lowcost[j];</p><p><b>  k=j;</b></p><p><b>  }</b></p><p>  printf("(%d,%d)%d\t",prevex[k]-1,k-1,min);</p><p>  lowcost[k]=0; //頂

140、點k加入U</p><p>  for(j=2;j<=n;j++) //修改由頂點k到其他頂點邊的權(quán)值</p><p>  if(g[k][j]<lowcost[j])</p><p><b>  {</b></p><p>  lowcost[j]=g[k][j];</p><p>

141、  prevex[j]=k;</p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  return 0;</b></p><p>&l

142、t;b>  }</b></p><p>  int acrvisited[100];//kruscal弧標記數(shù)組</p><p>  int find(int acrvisited[],int f)</p><p><b>  {</b></p><p>  while(acrvisited[f]>

143、;0)</p><p>  f=acrvisited[f];</p><p><b>  return f;</b></p><p><b>  }</b></p><p>  void kruscal_arc(MGraph_L G,algraph gra)</p><p>

144、<b>  {</b></p><p>  edg edgs[20];</p><p>  int i,j,k=0;</p><p>  for(i=0;i!=G.vexnum;++i)</p><p>  for(j=i;j!=G.vexnum;++j)</p><p><b>  {

溫馨提示

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

最新文檔

評論

0/150

提交評論