2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  數據結構與算法</b></p><p><b>  課程設計報告</b></p><p>  課程設計題目: 圖的算法實現 </p><p>  專業(yè)班級: 信息與計算科學1002班

2、 </p><p><b>  目錄</b></p><p>  摘要…………………………………………………1</p><p>  引言……………………………………………1</p><p>  需求分析………………………………………1</p><p>  概要設計……………………

3、…………………2</p><p>  詳細設計………………………………………4</p><p>  程序設計………………………………………10</p><p>  運行結果………………………………………18</p><p>  總結體會………………………………………19</p><p>  摘要(題目): 圖的算法實現

4、</p><p><b>  實驗內容</b></p><p><b>  圖的算法實現</b></p><p><b>  問題描述:</b></p><p> ?。?)將圖的信息建立文件;</p><p>  (2)從文件讀入圖的信息,建立鄰接矩陣和

5、鄰接表;</p><p> ?。?)實現Prim、Kruskal、Dijkstra和拓撲排序算法。</p><p>  關鍵字: 鄰接矩陣、Dijkstra和拓撲排序算法</p><p><b>  1.引言 </b></p><p>  本次數據結構課程設計共完成圖的存儲結構的建立、Prim、Kruskal、Dijks

6、tra和拓撲排序算法等問題。通過本次課程設計,可以鞏固和加深對數據結構的理解,通過上機和程序調試,加深對課本知識的理解和熟練實踐操作。</p><p>  通過本課程的學習,能夠熟練掌握數據結構中圖的幾種基本操作;</p><p>  能針對給定題目,選擇相應的數據結構,分析并設計算法,進而給出問題的正確求解過程并編寫代碼實現。</p><p><b> 

7、 使用語言:C</b></p><p>  Prim算法思想:從連通網N={V,E}中的某一頂點v0出發(fā),選擇與它關聯的具有最小權值的邊(v0,v),將其頂點加入到生成樹的頂點集合V中。以后每一步從一個頂點在V中,而另一個頂點不在V中的各條邊中選擇權值最小的邊(u,v),把它的頂點加入到集合V中。如此繼續(xù)下去,直到網中的所有頂點都加入到生成樹頂點集合V中為止。</p><p>

8、<b>  拓撲排序算法思想:</b></p><p>  1、從有向圖中選取一個沒有前驅的頂點,并輸出之;  2、從有向圖中刪去此頂點以及所有以它為尾的??;    重復上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點為止。沒有前驅 -- 入度為零,刪除頂點及以它為尾的弧-- 弧頭頂點的入度減1。</p><

9、;p><b>  2.需求分析</b></p><p>  通過鍵盤輸入建立一個新的有向帶權圖,建立相應的文件;</p><p>  對建立的有向帶權圖進行處理,要求具有如下功能:</p><p>  用鄰接矩陣和鄰接表的存儲結構輸出該有向帶權圖,并生成相應的輸出結果;</p><p>  用Prim、Kruska

10、l算法實現對圖的最小生成樹的求解,并輸出相應的輸出結果;</p><p>  用Dijkstra算法實現對圖中從某個源點到其余各頂點的最短路徑的求解,并輸出相應的輸出結果;</p><p> ?。?)實現該圖的拓撲排序算法。</p><p><b>  3.概要設計</b></p><p>  ADT Graph{<

11、;/p><p>  數據對象V:V是具有相同特性的數據元素的集合,稱為頂點集;</p><p><b>  數據關系R:</b></p><p><b>  R={VR}</b></p><p>  VR={<v,w>|v,w∈V且P(v,w),<v,w>表示從v到w的弧,謂詞P

12、(v,w)定義了弧<v,w>的意義或信息}</p><p><b>  基本操作:</b></p><p>  CreateGraph(&G,V,VR);</p><p>  Status CreateGraph(MGraph &G)</p><p>  //采用鄰接矩陣表示法,構造圖G.&l

13、t;/p><p>  Status CreateGraph(MGraph &G)</p><p>  //采用鄰接表表示法,構造圖G</p><p>  Status MinSpanTree_Prim(MGraph G,VertexType u)</p><p>  //用普里姆算法從第u個頂點出發(fā)構造網G的最小生成樹T,輸出T的各條邊&

14、lt;/p><p>  Status MinSpanTree_ Kruskal(MGraph G,VertexType u)</p><p>  //用克魯斯卡爾算法從第u個頂點出發(fā)構造網G的最小生成樹T,輸出T的各條邊</p><p>  Status ShortestPath_DIJ(MGraph G,int v0,PathMatrix &p,ShortP

15、athTable &D)</p><p>  //用 Dijkstra算法求有向網G的 v0頂點到其余頂點v的最短路徑P[v]及帶權長度D[v]</p><p>  Status TopSort(ALGraph G)</p><p>  //若G中無回路,則輸出G的頂點的一個拓撲排序并返回OK,否則返回ERROR</p><p>&l

16、t;b>  存儲結構</b></p><p>  typedef struct//鄰接矩陣存儲結構 </p><p><b>  {</b></p><p><b>  int no;</b></p><p><b>  int info;</b></p

17、><p>  }VertexType;</p><p>  typedef struct</p><p><b>  {</b></p><p>  int edges[MAXV][MAXV];</p><p><b>  int n,e;</b></p><

18、p>  VertexType vexs[MAXV];</p><p><b>  }MGraph;</b></p><p>  typedef struct ANode //鄰接表存儲結構 </p><p>  { int adjvex;</p><p>  struct ANode *nextarc

19、;</p><p><b>  int info;</b></p><p><b>  }ArcNode;</b></p><p>  typedef struct Vnode</p><p><b>  {</b></p><p><b> 

20、 int data;</b></p><p>  int count; </p><p>  ArcNode *firstarc;</p><p><b>  }VNode;</b></p><p>  typedef VNode AdjList[MAXV];</p><p>  ty

21、pedef struct </p><p><b>  {</b></p><p>  AdjList adjlist;</p><p><b>  int n,e;</b></p><p><b>  }ALGraph;</b></p><p>  

22、typedef struct node</p><p><b>  {</b></p><p><b>  int data;</b></p><p>  struct node *next;</p><p><b>  }List;</b></p><p&

23、gt;<b>  4、詳細設計</b></p><p>  圖的鄰接矩陣存儲結構算法:</p><p>  Status CreateUDN(MGraph &G){</p><p>  //采用鄰接矩陣表示法,構造無向網G</p><p>  Scanf(&G.vexnum,&G.arcnum,&

24、amp;IncInfo); //IncInfo為0則各弧不含其他信息</p><p>  for(i=0;i<G.vexnum;++i) scanf(&G.vexs[i]); //構造頂點向量</p><p>  for(i=0;i<G.vexnum;++i) //初始化鄰接矩陣</p><p>  for(j=0;j<G.v

25、exnum;++j) G.arcs[i][j]={INFINITY,NULL}; //{adj,info}</p><p>  for(k=0;k<G.arcnum;++k){ //構造鄰接矩陣</p><p>  scanf(&v1,&v2,&w); //輸入一條邊依附的頂點及權值</p><p>  i=Loca

26、teVex(G,v1); j=LocateVex(G,v2); //確定v1和v2在G中位置</p><p>  G.arcs[i][j].adj=w; //弧<v1,v2>的對稱弧<v2,v1></p><p><b>  }</b></p><p>  Return Ok;</p><p

27、>  }//CreateUDN</p><p>  圖的鄰接表存儲結構算法:</p><p>  void   CreateALGraPh(ALGraph   *G)         { //建立無向圖的鄰接表表示             int 

28、0; i,j,k;             EdgeNode   *s;             scanf( "%d%d ",&G-> n,&G-> e);   //讀入頂點數和邊數         &#

29、160;   for(i=0;i <G-> n;i++){//建立頂點表                 G-> adjlist[i].vertex=getchar();   //讀入頂點信息                 G->

30、 adjlist[i].firstedge=NULL;//邊表置為空表               }             for(k=0;k <G-> e;k++){ //建立邊表               

31、60;   scanf( "%d%d ",&i,&j);讀入邊(vi,vj)的頂點對序號                   s=(EdgeNode   *)malloc(sizeof</p><p>  Prim算法實現:Public static void pri

32、m(int n,float[][]) //prim算法</p><p>  {float[]lowcost=new float[n+1];</p><p>  Int[]closest=new int[n+1];</p><p>  Boolean[]s=new boolean[n+1];</p><p>  S[1]=true;</

33、p><p>  for(int i=2;i<=n;i++){</p><p>  Lowest[i]=c[1][i];</p><p>  Closest[i]=1;</p><p>  S[i]=false;</p><p><b>  }</b></p><p>  

34、for(int i=1;i<n;i++){</p><p>  float min=Float.MAX_VALUE;</p><p><b>  int j=1;</b></p><p>  for(int k=2;k<=n;k++)</p><p>  if((lowcost[k]<min)&

35、&(!s[k])){</p><p>  min=lowcost[k];</p><p><b>  j=k;</b></p><p><b>  }</b></p><p>  System.out.println(j+“, ”+closest[j]);</p><p&

36、gt;  S[j]=true;</p><p>  for(int k=2;k<=n;k++)</p><p>  if((c[j][k]<lowcost[k])&&(!s[k])){</p><p>  lowcost[k]=c[j][k];</p><p>  closest[k]=j;</p>

37、<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  Kruskal算法實現:</p><p>  Public static Boolean Kruskal(int n,int e,Edg

38、eNode[] E,EdgeNode[] t)</p><p><b>  {</b></p><p>  MinHeap H=new MinHeap(1);</p><p>  H.initialize(E,e);</p><p>  FastUnionFind U=new FastUnionFind(n);</

39、p><p><b>  Int k=0;</b></p><p>  While(e>0&&k<n-1){</p><p>  EdgeNode x=(EdgeNode)H.removeMin();</p><p><b>  e--;</b></p><

40、p>  int a=U.find(x.u);</p><p>  int b=U.find(x.v);</p><p><b>  if(a!=b){</b></p><p><b>  t[k++]=x;</b></p><p>  U.union(a,b);}</p><

41、;p><b>  }</b></p><p>  Return(k==n-1);</p><p><b>  }</b></p><p>  Dijkstra算法實現:</p><p>  Public static void Dijkstra(int v,float[][]a,float[]

42、dist,int[]prev)</p><p>  {//單源最短路徑問題的Dijkstra算法</p><p>  Int n=dist.length-1;</p><p>  If(v<1||v>n)return;</p><p>  Boolean[]s=new Boolean[n+1];</p><p&

43、gt;<b>  //初始化</b></p><p>  for(int i=1;i<=n;i++){</p><p>  dist[i]=a[v][i];</p><p>  s[i]=false;</p><p>  if(dist[i]==Float.MAX_VALUE)prev[i]=0;</p>

44、;<p>  else prev[i]=v;</p><p><b>  }</b></p><p>  Dist[v]=0;s[v]=true;</p><p>  for(int i=1;i<n;i++){</p><p>  float temp=Float.MAX_VALUE;</p&g

45、t;<p><b>  int u=v;</b></p><p>  for(int j=1;j<=n;j++)</p><p>  if((!s[i])&&(dist[i]<temp)){</p><p><b>  u=j;</b></p><p>  

46、temp=dist[j];</p><p><b>  }</b></p><p>  s[u]=true;</p><p>  for(int j=1;j<=n;j++)</p><p>  if((! s [j])&&(a[u][j]<Float.MAX_VALUE)){</p>

47、;<p>  float newdist=dist[u]+a[u][j];</p><p>  if(newdist<dist[j]){</p><p>  //dist[j]減少</p><p>  dist[j]=newdist;</p><p>  prev[j]=u;</p><p><

48、;b>  }}</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  圖的拓撲排序算法:</b></p><p>  void TopSort(ALGraph *G) </p>&l

49、t;p>  {//若G中無回路,則返回G的一個拓撲排序,且函數值為OK,否則為ERROR</p><p><b>  int i,j;</b></p><p>  ArcNode *p;</p><p>  if(k!=G->n)</p><p>  {for(i=0;i<G->n;i++)<

50、;/p><p>  {if(G->adjlist[i].count==0&&v[i]==0)</p><p>  {path[k]=i;</p><p><b>  k++;</b></p><p><b>  v[i]=1; </b></p><p>  

51、p=G->adjlist[i].firstarc;</p><p>  while(p!=NULL)</p><p>  { j=p->adjvex;</p><p>  G->adjlist[j].count--;</p><p>  p=p->nextarc;</p><p><b&g

52、t;  }</b></p><p>  TopSort(G);</p><p>  p=G->adjlist[i].firstarc;</p><p>  while(p!=NULL)</p><p>  { j=p->adjvex;</p><p>  G->adjlist[j].cou

53、nt++;</p><p>  p=p->nextarc;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b><

54、/p><p><b>  else </b></p><p>  { for(i=0;i<k;i++)printf("%d ",path[i]); </p><p>  printf("\n");</p><p><b>  }</b></p&g

55、t;<p><b>  k--;</b></p><p>  v[path[k]]=0;</p><p><b>  }</b></p><p><b>  5、程序設計</b></p><p>  #include <stdio.h></p&g

56、t;<p>  #include <stdlib.h></p><p>  #define MAXV 50</p><p>  #define INF 32767</p><p>  typedef int InfoType;</p><p>  //鄰接矩陣存儲方法 </p><p>  t

57、ypedef struct</p><p><b>  {</b></p><p><b>  int no;</b></p><p>  InfoType info;</p><p>  } VertexType;</p><p>  typedef struct</

58、p><p><b>  {</b></p><p>  int edges[MAXV][MAXV];</p><p><b>  int n,e;</b></p><p>  VertexType vexs[MAXV];</p><p>  } MGraph; </p>

59、;<p><b>  //狄克斯特拉算法</b></p><p>  void Ppath(int path[],int i,int v)</p><p><b>  {</b></p><p><b>  int k;</b></p><p>  k=path[

60、i];</p><p>  if(k==v) return;</p><p>  Ppath(path,k,v);</p><p>  printf("%d,",k);</p><p><b>  } </b></p><p>  void Dispath(int dist

61、[],int path[],int s[],int n,int v)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p>

62、<p>  if(i==v) continue;</p><p>  if(s[i]==1)</p><p><b>  {</b></p><p>  printf("從%d到%d的最短路徑長度為:%d\t路徑為:",v,i,dist[i]);</p><p>  printf(&qu

63、ot;%d,",v);</p><p>  Ppath(path,i,v);</p><p>  printf("%d\n",i);</p><p><b>  } </b></p><p>  else printf("從%d到%d不存在路徑\n",v,i);&l

64、t;/p><p><b>  } </b></p><p><b>  } </b></p><p>  void Dijkstra(MGraph g,int v)</p><p><b>  {</b></p><p>  int dist[MAXV

65、],path[MAXV];</p><p>  int s[MAXV];</p><p>  int mindis,i,j,u;</p><p>  for(i=0;i<g.n;i++)</p><p><b>  {</b></p><p>  dist[i]=g.edges[v][i];

66、</p><p><b>  s[i]=0;</b></p><p>  if(g.edges[v][i]<INF) path[i]=v;</p><p>  else path[i]=-1;</p><p><b>  } </b></p><p>  s[v]=1;

67、path[v]=0;</p><p>  for(i=0;i<g.n;i++)</p><p><b>  {</b></p><p>  mindis=INF;</p><p>  for(j=0;j<g.n;j++)</p><p><b>  {</b>&l

68、t;/p><p>  if(s[j]==0&&dist[j]<mindis)</p><p><b>  {</b></p><p><b>  u=j;</b></p><p>  mindis=dist[j];</p><p><b>  }

69、 </b></p><p><b>  } </b></p><p><b>  s[u]=1;</b></p><p>  for(j=0;j<g.n;j++)</p><p><b>  {</b></p><p>  i

70、f(s[j]==0)</p><p><b>  {</b></p><p>  if(g.edges[u][j]<INF&&dist[u]+g.edges[u][j]<dist[j])</p><p><b>  {</b></p><p>  dist[j]=dist

71、[u]+g.edges[u][j];</p><p>  path[j]=u;</p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b&g

72、t;  } </b></p><p>  Dispath(dist,path,s,g.n,v); </p><p><b>  } </b></p><p><b>  //弗洛伊德算法</b></p><p>  void Ppath1(int path[][MAXV],int

73、 i,int j)</p><p><b>  {</b></p><p><b>  int k;</b></p><p>  k=path[i][j];</p><p>  if(k==-1) return;</p><p>  Ppath1(path,i,k);<

74、/p><p>  printf("%d,",k);</p><p>  Ppath1(path,k,j);</p><p><b>  } </b></p><p>  void Dispath1(int A[][MAXV],int path[][MAXV],int n)</p><

75、;p><b>  {</b></p><p><b>  int i,j;</b></p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p><p>  for(j=0;j<n;j++)</p><

76、;p><b>  {</b></p><p>  if(i==j) continue;</p><p>  if(A[i][j]==INF)</p><p><b>  {</b></p><p>  if(i!=j) printf("從%d到%d不存在路徑\n",i,j)

77、;</p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("從%d到%d的最短路徑長度為:%d\t路徑為:",i,j,A[i][j]);<

78、/p><p>  printf("%d,",i);</p><p>  Ppath1(path,i,j);</p><p>  printf("%d\n",j);</p><p><b>  } </b></p><p><b>  } &

79、lt;/b></p><p><b>  } </b></p><p><b>  } </b></p><p>  void Floyd(MGraph g)</p><p><b>  {</b></p><p>  int A[MAXV]

80、[MAXV],path[MAXV][MAXV];</p><p>  int i,j,k;</p><p>  for(i=0;i<g.n;i++)</p><p><b>  {</b></p><p>  for(j=0;j<g.n;j++)</p><p><b>  

81、{</b></p><p>  A[i][j]=g.edges[i][j];</p><p>  path[i][j]=-1; </p><p><b>  } </b></p><p><b>  } </b></p><p>  for(k=0;k<

82、;g.n;k++)</p><p><b>  {</b></p><p>  for(i=0;i<g.n;i++)</p><p><b>  {</b></p><p>  for(j=0;j<g.n;j++)</p><p><b>  {<

83、/b></p><p>  if(A[i][j]>A[i][k]+A[k][j])</p><p><b>  {</b></p><p>  A[i][j]=A[i][k]+A[k][j];</p><p>  path[i][j]=k;</p><p><b>  }

84、 </b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  Dispath1(A,path,g.n); </p><p>&

85、lt;b>  } //主函數</b></p><p>  int main()</p><p>  { int i,j,n;</p><p><b>  MGraph g;</b></p><p>  printf("請輸入帶權有向圖的頂點個數:");//6</p>

86、<p>  while(scanf("%d",&n)!=EOF) </p><p><b>  {</b></p><p>  printf("請輸入帶權有向圖的鄰接矩陣:\n"); </p><p><b>  /*</b></p><p&

87、gt;  0 5 32767 7 32767 32767</p><p>  32767 0 4 32767 32767 32767</p><p>  8 32767 0 32767 32767 9</p><p>  32767 32767 5 0 32767 6</p><p>  32767 32767 32767 5 0 32767

88、</p><p>  3 32767 32767 32767 1 0</p><p><b>  */ </b></p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p><p>  for(j=0;j<n;j++)

89、</p><p><b>  {</b></p><p>  scanf("%d",&g.edges[i][j]);</p><p><b>  }</b></p><p><b>  }</b></p><p><b&

90、gt;  g.n=n;</b></p><p>  printf("采用狄克斯特拉算法得到的最短路徑為:\n");</p><p>  for(i=0;i<n;i++) Dijkstra(g,i);printf("\n"); </p><p>  printf("采用弗洛伊德算法得到的最短路徑為:\

91、n");Floyd(g);</p><p>  printf("\n請輸入帶權無向圖的頂點個數:");</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></

92、p><p><b>  6、程序運行結果:</b></p><p><b>  總結體會</b></p><p>  通過本次課程設計,對圖的概念有了一個新的認識,在學習離散數學的時候,總覺得圖是很抽象的東西,但是在學習了《數據結構》后,我慢慢體會到了其中的奧妙,圖能夠在計算機中存在,首先要知道它有哪些具體化、數字化的信息,比

溫馨提示

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

評論

0/150

提交評論