這個作業屬於哪個課程
資料結構
這個作業要求在**
這個作業的目標
1、掌握圖的鄰接矩陣和鄰接表表示2、掌握圖的深度優先和廣度優先搜尋方法3、理解圖的應用方法
學號2017207338
一、實驗目的
1、掌握圖的鄰接矩陣和鄰接表表示
2、掌握圖的深度優先和廣度優先搜尋方法
3、理解圖的應用方法
二、實驗預習
說明以下概念
1、深度優先搜尋遍歷:
深度優先搜尋(dfs)是用於遍歷或搜尋樹或圖資料結構的演算法。該演算法從根節點開始(在圖的情況下選擇一些任意節點作為根節點),並在回溯之前盡可能沿著每個分支進行探索。
2、廣度優先搜尋遍歷:
廣度優先搜尋遍歷或橫向優先搜尋,是一種圖形搜尋演算法。簡單的說,bfs是從根節點開始,沿著樹的寬度遍歷樹的節點。如果所有節點均被訪問,則演算法中止。
4、最小生成樹:
最小生成樹是一副連通加權無向圖中一棵權值最小的生成樹。最小生成樹其實是最小權重生成樹的簡稱。
5、最短路徑:
最短路徑問題旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法可以用於得出最短路徑的最優解。
三、實驗內容和要求
1、閱讀並執行下面程式,根據輸入寫出執行結果。
#include#define n 20
#define true 1
#define false 0
int visited[n];
typedef struct queue;
typedef struct
graph;
void creategraph(graph *g); /*建立乙個無向圖的鄰接矩陣*/
void dfs(int i,graph *g); /*從第i個頂點出發深度優先搜尋*/
void tdfs(graph *g); /*深度優先搜尋整個圖*/
void bfs(int k,graph *g); /*從第k個頂點廣度優先搜尋*/
void tbfs(graph *g); /*廣度優先搜尋整個圖*/
void init_visit(); /*初始化訪問標識陣列*/
void creategraph(graph *g)
g->vexnum=i; /*頂點數目*/
for(i=0; ivexnum; i++) /*鄰接矩陣初始化*/
for(j=0; jvexnum; j++)
g->arcs[i][j]=0;
printf("輸入邊的資訊:\n");
scanf("%d,%d",&i,&j); /*讀入邊i,j*/
while(i!=-1)
}void dfs(int i,graph *g)
void tdfs(graph *g)
void bfs(int k,graph *g) }}
void tbfs(graph *g)
void init_visit() edgenode;
typedef struct vnode /*圖的鄰接表:鄰接表*/
vnode;
int creategraph_list(vnode adjlist,int *p); /*建立有向圖的鄰接表*/
void topsort(vnode g,int n); /*拓撲排序*/
int creategraph_list(vnode adjlist,int *p) /*建立有向圖的鄰接表*/
n=i;
*p=n;
/*建立鄰接鍊錶*/
printf("\n請輸入弧的資訊(i=-1結束):i,j:\n");
scanf("%d,%d",&i,&j);
while(i!=-1)
printf("鄰接表:");
for(i=0; i%d",s->adjvex);
s=s->next;}}
return n;
}void topsort(vnode g,int n) /*拓撲排序*/
while (top!=-1) //棧不為空
p=p->next;}}
// if (m根據輸入,輸出有向圖的拓撲排序序列。並畫出有向圖。
輸入:abcdef#
0,11,2
2,34,1
4,5-1,-1
執行結果:
3、閱讀並執行下面程式。
#define n 20
#define true 1
#define inf 32766 /*鄰接矩陣中的無窮大元素*/
#define infin 32767/*比無窮大元素大的數*/
typedef struct
graph;
void creategraph_w(graph *g,int flag);
void prim(graph *g,int u);
void dijkstra(graph g,int v);
void showprim();
void showdij();
/*建帶權圖的鄰接矩陣,若flag為1則為無向圖,flag為0為有向圖*/
void creategraph_w(graph *g,int flag)
g->vexnum=i;
for(i=0;i<6;i++) /*鄰接矩陣初始化*/
for(j=0;j<6;j++)
g->arcs[i][j]=inf;
printf("輸入邊的資訊:\n");
scanf("%d,%d,%d",&i,&j,&w); /*讀入邊(i,j,w)*/
while(i!=-1) /*讀入i為-1時結束*/
}void prim(graph *g,int u)/*出發頂點u*/
lowcost[u]=0;
for(i=1;ivexnum;i++) /*迴圈求最小生成樹中的各條邊*/
}}void printpath(graph g,int startvex,int endvex)
else}}
}void dijkstra(graph g,int v)
}}void showprim()/*最小生成樹prim演算法演示*/
void showdij()
int main()
下面的輸入分別驗證prim演算法和dijstra演算法。輸入例項的第一部分為無向圖,求其最小生成樹;輸入的第二部分為有向圖,求其最短路徑。
最小生成樹 最短路徑
abcdef#
0,1,6
0,2,1
0,3,5
1,2,5
1,4,3
2,3,5
2,4,6
2,5,4
3,5,2
4,5,6
-1,-1,-1
abcdef#
0,2,10
0,5,100
0,4,30
1,2,5
2,3,50
3,4,20
3,5,10
4,3,20
4,5,60
-1,-1,-1
執行結果:
四、實驗小結
通過本次實驗,對於圖的兩種定義方法要熟記,注意在不同場合的應用,邊數較多則可以用鄰接矩陣,較少則可以利用鄰接表。
同時也對圖的基本演算法具有了很多了解,同時也要注意圖與樹之間的聯絡,在圖中尋找最小生成樹的過程都是防止形成迴路來實現的,在這些演算法設計時多增加了乙個陣列來儲存訪問的資訊,這種用來輔助的設計十分的巧妙,需要注重理解。
在圖的遍歷中,有向圖是可以進行拓撲排序。
第七次作業
磁碟管理和維護 磁碟檔名 dev sd a p 1 128 dev hd a p 1 128 dev vd a p 1 128 heads 磁面 sectors track 扇區 cylinders磁柱 分割槽命令 fdisk dev sd 格式化 mkfs.ext4 dev sda mkfs.xf...
第七次作業
共有一下六步 1.客戶機提出網域名稱解析請求,並將該請求傳送給本地的網域名稱伺服器。2.當本地的網域名稱伺服器收到請求後,就先查詢本地的快取,如果有該紀錄項,則本地的網域名稱伺服器就直接把查詢的結果返回。3.如果本地的快取中沒有該紀錄,則本地網域名稱伺服器就直接把請求發給根網域名稱伺服器,然後根網域...
第七次作業
練習題 1 上面提到了許多魔法方法,如 new init,str,rstr,getitem,setitem 等等,請總結它們各自的使用方法。init 方法,可以理解為初始化方法。new 方法,建立乙個例項物件。只要自己定義了 str self 方法,使用print輸出物件的時候,那麼就會列印從在這個...