ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:91.77KB ,
资源ID:23316955      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23316955.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(CSU算法分析与设计实验报告.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

CSU算法分析与设计实验报告.docx

1、CSU算法分析与设计实验报告算法分析与设计实验报告学院: 信息科学与工程学院 专业: 学号: 姓名: 指导老师: 2010年1月7日 (一) BFS-based shortest path Write a BFS-based 运行方法:建立c:graph.txt,里面保存的是用于构建图的信息。我测试程序时输入的图如下:1 21 32 42 53 85 84 65 7图形表示该图为图1.1下面找出1-8之间的最短路径:下面是7-8之间的最短路径:自己观察图可知,以上两组源结点与目标结点之间的路径不止一条,上面显示的确实是最短路径。测试正确。程序重要的是要构建正确的结点的结构。源程序:#inclu

2、de #include #define MAX_VEXVALUE_NUM 50enum COLORwhite = 1,grey,black;typedef struct NODE int depth;/结点被访问的深度 int vex_value;/结点表示的值 COLOR color; struct NODE *pre;/指向父母节点NODE;typedef struct NODE vexsMAX_VEXVALUE_NUM;/结点 int vexnum;/图中结点数 int graphMAX_VEXVALUE_NUMMAX_VEXVALUE_NUM;/邻接矩阵Graph;bool visit

3、edMAX_VEXVALUE_NUM;/访问标识void readGraph(Graph &gra);void printGraph(Graph &gra);void shortestPath(Graph &G,NODE source,NODE dest);int locate(Graph G,NODE vex);/确定结点vex的在矩阵中的位置int locateByVexvalue(Graph G,int val);/根据结点中的数确定在邻接矩阵呢中的位置int main(int argv,char* argc) Graph g; int i; NODE s,d; readGraph(g)

4、; printGraph(g); int source,dest; printf(*求最短路径*n); printf(请输入源结点:); scanf(%d,&source); printf(请输入目的结点:); fflush(stdin); scanf(%d,&dest); fflush(stdin); for(i=0;ig.vexnum;+i) if(source = g.vexsi.vex_value) s = g.vexsi; break; for(i=0;ivex_value; +temp_len; p = p-pre; printf(最短路径为:); for(;temp_len 0;

5、-temp_len) printf(%d,temptemp_len-1); printf(n); return 0;void readGraph(Graph &gra)/读取文件,构造一个图 int v1,v2; int i,j; FILE *fp; if(!(fp = fopen(c:graph.txt,r) perror(不能打开文件!); exit(-1); gra.vexnum = 0; while(!feof(fp)/反复读取文件知道文件结束 fscanf(fp,%d %d,&v1,&v2); for(i=0;igra.vexnum;+i) if(v1 = gra.vexsi.vex

6、_value) break; if(i = gra.vexnum) gra.vexsgra.vexnum.vex_value = v1; +gra.vexnum; for(i=0;igra.vexnum;+i) if(v2 = gra.vexsi.vex_value) break; if(i = gra.vexnum) gra.vexsgra.vexnum.vex_value = v2; +gra.vexnum; printf(图中共有%d个节点n节点为:,gra.vexnum); for(i=0;i gra.vexnum;+i )/初始化每个结点的颜色为白色,深度,前向指针 gra.vexs

7、i.color = white; gra.vexsi.depth = 0; gra.vexsi.pre = NULL; for(i=0;i gra.vexnum;+i) printf(%d,%dn,gra.vexsi.vex_value,gra.vexsi.color); printf(n); for(i = 0;i gra.vexnum;+i)/初始化邻接矩阵 for(j = 0;j gra.vexnum;+j) gra.graphij = 0; fseek(fp,SEEK_SET,0); while(!(feof(fp)/第二次读取文件,获取输入边的信息 fscanf(fp,%d %d,&

8、v1,&v2); i =locateByVexvalue(gra,v1); j =locateByVexvalue(gra,v2); gra.graphji = gra.graphij = 1; fclose(fp);void printGraph(Graph &gra)/以邻接表形式打印图中各个结点 int i; for(i=0;i gra.vexnum;+i)/以矩阵形式打印邻接矩阵 for(int j=0;j gra.vexnum;+j) printf(%d ,gra.graphij); printf(n); for(i = 0;i gra.vexnum;+i) printf(%d-,g

9、ra.vexsi.vex_value);/由邻接矩阵的索引确定在该行的元素 for(int j = 0;j gra.vexnum;+j) if(gra.graphij != 0) printf(%d,gra.vexsj.vex_value); printf(n); typedef struct Queue/访问队列 int vexMAX_VEXVALUE_NUM; int length;Queue;void InitQueue(Queue &Q)/初始化访问队列 Q.length = 0;void EnQueue(Queue &Q,int i)/向队列Q中插入元素i +Q.length; Q.

10、vexQ.length-1 = i;void DeQueue(Queue &Q)/队首结点出列 for(int i=0;i = Q.length-2;+i) Q.vexi = Q.vexi+1; -Q.length;int locate(Graph G,NODE vex)/确定结点vex的在矩阵中的位置 for(int i=0;iG.vexnum;+i) if(vex.vex_value = G.vexsi.vex_value) return i; return -1;int locateByVexvalue(Graph G,int val) for(int i=0;iG.vexnum;+i)

11、 if(val = G.vexsi.vex_value) return i; return -1;void shortestPath(Graph &G,NODE source,NODE dest)/寻找最短路径 int i,j; int u; int w = 0; Queue Q; InitQueue(Q); i = locate(G,source); j = locate(G,dest); EnQueue(Q,i); while(Q.length != 0) u = Q.vex0;/取出u对其表示的结点进行BFS DeQueue(Q); for(w = 0;w G.vexnum;+w)/找出

12、u表示的结点的每个邻接点 if(G.graphuw != 0)/判断位置w处的结点是否和u位置的结点邻接 if(G.vexsw.color = white)/如果颜色为白色 G.vexsw.color = grey;/颜色访问后成为灰色 G.vexsw.depth = G.vexsu.depth + 1; G.vexsw.pre = &G.vexsu; EnQueue(Q,w); if(w = j) break;/死端则使结点颜色为黑色 G.vexsu.color = black; (二) DFS遍历图连通及环 (1) given a graph G, test if G is connect

13、ed. 使用1题中的数据,图如1.1,可以看出此图是连通的。下面测试程序:将上述数据中的7 8改为7 9,来得到一个不连通的图,来测试不连通的情况。如下:测试成功。源代码:#include #include #define MAX_VEXVALUE_NUM 50enum COLORwhite = 1,grey,black;typedef struct NODE int depth;/结点被访问的深度 int vex_value;/结点表示的值 COLOR color; struct NODE *pre;NODE;typedef struct NODE vexsMAX_VEXVALUE_NUM;

14、/结点 int vexnum;/图中结点数 int graphMAX_VEXVALUE_NUMMAX_VEXVALUE_NUM;/邻接矩阵Graph;void readGraph(Graph &gra);void printGraph(Graph &gra);int locate(Graph G,NODE vex);/确定结点vex的在矩阵中的位置int locateByVexvalue(Graph G,int val);/根据结点中的数确定在邻接矩阵呢中的位置void dfs_visited(Graph &G,NODE &p);void testConnected(Graph G);int

15、main(int argv,char* argc) Graph g; readGraph(g); printGraph(g); testConnected(g); return 0;void readGraph(Graph &gra)/读取文件,构造一个图 int v1,v2; int i,j; FILE *fp; if(!(fp = fopen(c:graph.txt,r) perror(不能打开文件!); exit(-1); gra.vexnum = 0; while(!feof(fp)/反复读取文件知道文件结束 fscanf(fp,%d %d,&v1,&v2); for(i=0;igra

16、.vexnum;+i) if(v1 = gra.vexsi.vex_value) break; if(i = gra.vexnum) gra.vexsgra.vexnum.vex_value = v1; +gra.vexnum; for(i=0;igra.vexnum;+i) if(v2 = gra.vexsi.vex_value) break; if(i = gra.vexnum) gra.vexsgra.vexnum.vex_value = v2; +gra.vexnum; printf(图中共有%d个节点n节点为:,gra.vexnum); for(i=0;i gra.vexnum;+i

17、 )/初始化每个结点的颜色为白色,深度,前向指针 gra.vexsi.color = white; gra.vexsi.depth = 0; gra.vexsi.pre = NULL; for(i=0;i gra.vexnum;+i) printf(%d,%dn,gra.vexsi.vex_value,gra.vexsi.color); printf(n); for(i = 0;i gra.vexnum;+i)/初始化邻接矩阵 for(j = 0;j gra.vexnum;+j) gra.graphij = 0; fseek(fp,SEEK_SET,0); while(!(feof(fp)/第

18、二次读取文件,获取输入边的信息 fscanf(fp,%d %d,&v1,&v2); i =locateByVexvalue(gra,v1); j =locateByVexvalue(gra,v2); gra.graphji = gra.graphij = 1; fclose(fp);void printGraph(Graph &gra)/以邻接表形式打印图中各个结点 int i; for(i=0;i gra.vexnum;+i)/以矩阵形式打印邻接矩阵 for(int j=0;j gra.vexnum;+j) printf(%d ,gra.graphij); printf(n); for(i

19、= 0;i gra.vexnum;+i) printf(%d-,gra.vexsi.vex_value);/由邻接矩阵的索引确定在该行的元素 for(int j = 0;j gra.vexnum;+j) if(gra.graphij != 0) printf(%d,gra.vexsj.vex_value); printf(n); int locate(Graph G,NODE vex)/确定结点vex的在矩阵中的位置 for(int i=0;iG.vexnum;+i) if(vex.vex_value = G.vexsi.vex_value) return i; return -1;int l

20、ocateByVexvalue(Graph G,int val) for(int i=0;iG.vexnum;+i) if(val = G.vexsi.vex_value) return i; return -1;void testConnected(Graph G)/测试是否连通 int i=0; int buliantong = -1; for(i=0;i 0) printf(此图不连通!n); return; dfs_visited(G,G.vexsi); printf(此图连通!n);void dfs_visited(Graph &G,NODE &p)/dfs遍历图 p.color =

21、 grey; int w = 0; int u = locate(G,p); for(w = 0;w G.vexnum;+w)/找出u表示的结点的每个邻接点 if(G.graphuw != 0)/判断位置w处的结点是否和u位置的结点邻接 if(G.vexsw.color = white)/如果颜色为白色 dfs_visited(G,G.vexsw); p.color = black; (2) given a graph G, test if G has a cycle,if so,print a cycle判断是否有环,既判断是否有回边。对于图1.1.本程序与只需将2.1题中的函数void d

22、fs_visited(Graph &G,NODE &p) 和void testConnected(Graph G)去掉,增加一个circle函数即可。void circle(Graph &G,NODE &p)/判断是否有环并且打印环 p.color = grey; int w = 0; int u = locate(G,p); for(w = 0;w vex_value) NODE* q = &p; while(q != NULL) printf(%d,q-vex_value); q = q-pre; printf(有环n); return; p.color = black; (三)N皇后问题

23、Using DFS to solve the following problems: (1) given a graph G, test if G is connected. 使用1题中的数据,图如1.1,可以看出此图是连通的。下面测试程序:将上述数据中的7 8改为7 9,来得到一个不连通的图,来测试不连通的情况。如下:测试成功。源代码:#include #include #define MAX_VEXVALUE_NUM 50enum COLORwhite = 1,grey,black;typedef struct NODE int depth;/结点被访问的深度 int vex_value;

24、/结点表示的值 COLOR color; struct NODE *pre;NODE;typedef struct NODE vexsMAX_VEXVALUE_NUM;/结点 int vexnum;/图中结点数 int graphMAX_VEXVALUE_NUMMAX_VEXVALUE_NUM;/邻接矩阵Graph;void readGraph(Graph &gra);void printGraph(Graph &gra);int locate(Graph G,NODE vex);/确定结点vex的在矩阵中的位置int locateByVexvalue(Graph G,int val);/根据结点中的数确定在邻接矩阵呢中的位置void dfs_visited(Graph &G,NODE &p);void testConnected(Graph G);int main(int argv,char* argc) Graph g; readGraph(g); printGra

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1