閩
江
學
院
電
子
系
實 實
驗
報 報
告 學生姓名:
班級: 學 學 號:
課程:算法與數據結構 一、 實驗題目::圖及其應用 一、
實驗地點:實驗樓 A210 二、
實驗目得: . 熟練掌握圖得兩種存儲結構(鄰接矩陣與鄰接表)得表示方法 . 掌握圖得基本運算及應用 。
加深對圖得理解,逐步培養解決實際問題得編程能力
三、
實驗內容: 。
采用鄰接表或鄰接矩陣方式存儲圖,實現圖得深度遍歷與廣度遍歷; 、 用廣度優先搜索方法找出從一頂點到另一頂點邊數最少得路徑; 。
圖得存儲結構得轉換。
四、
實驗環境( 使用得 軟硬件): Visual C++集成開發環境 五、 實驗步驟及操作 1。啟動 VC++; 2、 新建工程/Win32 Console Application,選擇輸入位置:輸入工程得名稱:tu; 按“確定”按鈕,選擇“An Empty Project”,再按“完成”按鈕, 3。新建文件/C++ Source File,選中“添加到工程得復選按鈕”,輸入文件名“1. cpp”,按“確定” 按鈕,在顯示得代碼編輯區內輸入如下得參考程序: #include 〈stdio.h> #include <stdlib。h〉 #define Infinity 1000 #define MAX 20
typedef struct{
int vexnum;
//頂點數目
int arcnum;
//弧數目
量向點頂//
;]XAM[sxev rahc? 陣矩接鄰//
;]XAM[]XAM[scra tni? U 圖向無,D圖向有:類種得圖//
;dnik rahc?}MGraph; //圖得建立 MGraph Creat_MGraph(){
MGraph G;
int i,j,k,w;
char v1,v2;
;)"n\!)U(圖向無,)D(圖向有(類種得圖入輸請"(ftnirp? scanf("%c",&G。kind);
;)"n\!目數弧與目數點頂入輸請"(ftnirp? scanf("%d%d”,&G。vexnum,&G、arcnum);
;)(rahcteg?
printf("請輸入各個頂點(abc)!\n");
for(i=0;i〈G。vexnum;i++)
? scanf(”%c",&G。vexs[i]);
getchar();
for(i=0;i<G.vexnum;i++){
)++j;munxev、G〈j;0=j(rof? ?
G.arcs[i][j]=Infinity;
}
for(i=0;i〈G。arcnum;i++){
printf("請輸入第 (%d) 條弧得起始點與它得權重(ccd)!\n",i+1);
;)w&,2v&,1v&,”d%c%c%"(fnacs??
;)(rahcteg?
j=k=0;
while(G、vexs[j]!=v1) j++;
//起點
點終//
;++k )2v=!]k[sxev。G(elihw?? ;w=]k[]j[scra、G??
)"U"==dnik、G(fi?
G、arcs[k][j]=w;
}? ;G nruter?} int visited[MAX];
//標志數組,顯示就是否遍歷 //遞歸深度遍歷調用函數 void DFS(MGraph G,int i){
;j tni? visited[i]=1;
printf(”
%c
",G、vexs[i]);
)++j;munxev.G<j;0=j(rof?
)ytinifnI〈]j[]i[scra.G&&]j[detisiv!(fi?
;)j,G(SFD??} //深度遍歷函數 void M_DFSTraverse(MGraph G){
;i tni? printf(”深度遍歷圖結果如下:
\n");
for(i=0;i〈G。vexnum;i++)
visited[i]=0;
)++i;munxev。G<i;0=i(rof? )]i[detisiv!(fi??
;)i,G(SFD??
printf("\n”);
}
??//廣度遍歷函數 void M_BFSTraverse(MGraph G){
int i,j,k,Q[MAX],w;
j=k=0;
printf("廣度遍歷圖結果如下: \n”);
for(i=0;i〈G。vexnum;i++)
visited[i]=0;
)++i;munxev、G<i;0=i(rof? ? if(!visited[i]){
?
visited[i]=1;
?
printf(”
%c
",G。vexs[i]);
;i=]++k[Q?? ?? while(j!=k){
?
;++j? ?
for(w=0;w〈G.vexnum;w++)
??
if(!visited[w] && G、arcs[j][w]〈Infinity){
? ?;1=]w[detisiv? ??
?? printf("
%c
”,G.vexs[w]);
?
Q[k++]=w;
?
?
}?
}??
}
;)"n\"(ftnirp?} //最小生成樹函數,對無向圖適用 void MiniSpanTree_PRIM(MGraph G,char u){
char adjvex[MAX];
int lowcost[MAX];
;nim,0=k,j,i tni? ;)"n\
:為樹成生小最得圖"(ftnirp? while(G。vexs[k]!=u) k++;
for(i=0;i〈G、vexnum;i++)
? if(i!=k){
adjvex[i]=u;
lowcost[i]=G。arcs[k][i];
}? lowcost[k]=0;
for(i=0;i<G、vexnum-1;i++){
;ytinifnI=nim?
for(j=0;j<G.arcnum;j++)
? if(lowcost[j] && lowcost[j]<min){ ;]j[tsocwol=nim?? ?;j=k?
}
printf("%c—-(%d)-—%c\n”,adjvex[k],lowcost[k],G、vexs[k]);
;0=]k[tsocwol??
)++j;munxev.G<j;0=j(rof?? ?
if(G.arcs[k][j]〈lowcost[j]){
?
adjvex[j]=G、vexs[k];
?
;]j[]k[scra、G=]j[tsocwol? ?
} ? } } //求最短路徑得函數,對有向圖適用 void ShortestPath_DIJ(MGraph G,char u){
點得上徑路短最志標,組數維二//
,]XAM[]XAM[P tni? ? D[MAX],
//記錄最短路徑得長度
徑路短最得它得求否是就志標//
,]XAM[lanif?? ? i,j,v,w,v0,min;
;0=0v? ;++0v )u=!]0v[sxev.G(elihw? for(v=0;v〈G.vexnum;++v){
//初始化
;]v[]0v[scra。G=]v[D??
final[v]=0;
)++w;munxev、G<w;0=w(rof??
;0=]w[]v[P??
if(D[v]〈Infinity){
? P[v][v0]=1;
P[v][v]=1;
? }
}
D[v0]=0;final[v0]=1;
for(i=1;i<G、vexnum;i++){
//循環求出各個最短路徑
;ytinifnI=nim?? )w++;munxev。G<w;0=w(rof???)]w[lanif!(fi? ?{)nim<]w[D(fi?
;]w[D=nim
;w=v?
}?
final[v]=1;
for(w=0;w<G。vexnum;w++)
?
徑路短最改修//
{))]w[D<]w[]v[scra.G+nim( && ]w[lanif!(fi?
;]w[]v[scra、G+nim=]w[D?
?
)++j;munxev.G〈j;0=j(rof? ??
?
P[w][j]=P[v][j];
?;1=]w[]w[P?
} ?? }? printf("從已知點到其她各點得最短路徑為: \n");
)++v;munxev、G〈v;0=v(rof? {)]v[lanif(fi?? ?
printf("%c-—%c 得最短路徑長度為 %d ,路徑為:”,u,G、vexs[v],D[v]);
?
)++w;munxev.G<w;0=w(rof? ?)]w[]v[P(fi?
?? printf(”
%c
",G。vexs[w]);
printf("\n”);
}??}
?void main(){
;G hparGM?
G=Creat_MGraph();
M_DFSTraverse(G);
M_BFSTraverse(G);
if(G、kind=="U")
MiniSpanTree_PRIM(G,'a");
//無向圖就求它得最小生成樹
esle?
ShortestPath_DIJ(G,"a’);
//有向圖就求它得最短路徑 }
4、 按F7 鍵,或工具圖標進行工程得建立,如有錯誤,根據錯誤顯示區中得提示,改正錯誤,重新建立 應用程序; 5.按 Ctrl+F5 鍵,或工具圖標進行工程得執行。
6、新建工程/Win32 Console Application,選擇輸入位置:輸入工程得名稱:圖得存儲結構轉換; 按“確定”按鈕,選擇“An Empty Project”,再按“完成"按鈕, 7.新建文件/C++ Source File,選中“添加到工程得復選按鈕”,輸入文件名“1。
cpp”,按“確定” 按鈕,在顯示得代碼編輯區內輸入如下得參考程序:
#include<stdio。h〉 #include<stdlib、h〉 #define MAX 5 #define INF 100000 int visit[MAX]={0}; typedef struct mgraph {
int edges[MAX][MAX];
int n,e; }MGraph; typedef struct node {
int adjvex;
struct node *nextarc; }ArcNode; typedef struct Vnode {
ArcNode *firstarc; }VNode; typedef struct algraph {
VNode adjlist[MAX];
int n,e; }ALGraph; void MtoAL(MGraph mg,ALGraph* &alg) {
int i,j,n=mg.n;
ArcNode *p;
alg=(ALGraph *)malloc(sizeof(ALGraph));
for(i=0;i<n;i++)
alg->adjlist[i]、firstarc=NULL;
for(i=0;i<n;i++)
{
for(j=n—1;j>=0;j—-)
{
if(mg、edges[i][j]!=0)
{
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p-〉nextarc=alg->adjlist[i].firstarc;
alg->adjlist[i]。firstarc=p;
}
}
alg-〉n=mg、n;
alg—〉e=mg.e;
} } void ALtoM(ALGraph *alg,MGraph &mg) {
int i=0,n=alg-〉n;
ArcNode *p;
for(i=0;i〈n;i++)
{
p=alg-〉adjlist[i].firstarc;
while(p)
{
mg、edges[i][p->adjvex]=1;
p=p—>nextarc;
}
}
mg。n=alg->n;
mg。e=alg—〉e; } void PrintMGraph(MGraph mg) {
for(int i=0;i<MAX;i++)
{
for(int j=0;j〈MAX;j++)
printf(”%-3d",mg。edges[i][j]);
printf(”\n");
}
printf(”the num of edge is:%-3d\n”,mg。e);
printf("the num of vertex is:%-3d\n",mg、n); } void PrintALGraph(ALGraph* alg) {
for(int i=0;i〈MAX;i++)
{
if(alg->adjlist[i]、firstarc)
{
printf(”vertex[%d]:”,i);
ArcNode* p=alg-〉adjlist[i]、firstarc;
while(p)
{
printf(”%-3d”,p->adjvex);
p=p—>nextarc;
}
}
printf("\n");
} } void main() {
MGraph mg;
ALGraph *alg;
mg、n=5;mg、e=6;
int path[MAX];
int a[MAX][MAX]={ {0,1,0,1,0},{1,0,1,0,0},{0,1,0,1,1},{1,0,1,0,1},{0,0,1,1,0}};
int i,j;
for(i=0;i〈mg、n;i++)
for(int j=0;j<mg。n;j++)
mg、edges[i][j]=a[i][j];
printf("鄰接矩陣表示圖:\n”);
PrintMGraph(mg);
MtoAL(mg,alg);
printf(”轉化為鄰接表表示圖:\n”);
PrintALGraph(alg);
ALtoM(alg,mg);
printf(”轉化為鄰接矩陣表示圖:\n");
PrintMGraph(mg); } 8。
按 F7 鍵,或工具圖標進行工程得建立,如有錯誤,根據錯誤顯示區中得提示,改正錯誤,重新建立 應用程序; 9、按Ctrl+F5 鍵,或工具圖標進行工程得執行。
六、 實驗結果: (1)無向圖
(2)有向圖
(3)圖得存儲結構得轉換
五、
實驗總結及心得體會:
從一個頂點出發只能訪問到它所在連通分量得各頂點、如果有回路存在,一個頂點被訪問之后又可能沿回路回到該頂點,為了避免對同一個頂點多次訪問,在遍歷過程中必須記下已經訪問過得頂點,通常利用一維輔助數組記錄頂點被訪問得情況、 六、
對本實驗過程及方法、手段得改進建議:
報告評分: 指導教師簽字:
批閱日期:
推薦訪問: 實驗 報告同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究