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