图的基本操作及图的应用.docx
- 文档编号:7482478
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:11
- 大小:118.01KB
图的基本操作及图的应用.docx
《图的基本操作及图的应用.docx》由会员分享,可在线阅读,更多相关《图的基本操作及图的应用.docx(11页珍藏版)》请在冰豆网上搜索。
图的基本操作及图的应用
实验五图的基本操作
一.要求:
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
二:
算法设计:
(1)用到的结构:
逻辑结构(循环结构,条件结构,顺序结构)
存储结构(邻接表)
(2)算法设计思路:
采用邻接表的方式创建图并对其进行深度和广度优先遍
历。
首先创建一个无向图voidCreateUDN(Graph&G),利用intLocate(GraphG,charc)查找元素的位置,利用intFirstVex(GraphG,intk)intNextVex(GraphG,inti,intj)方法分别需找第一个邻接点和下一个邻接点。
图常见好以后就分别利用voidDFS(GraphG,intk)深度优先voidBFS(GraphG)广度优先进行遍历。
输出结果。
(3)三:
调试和测试:
(1)调试过程总结:
在输入弧的时候没有加1,没有达到预期的效果。
(2)三组测试数据及实验结果:
第一组:
7个顶点(ABCDEFG)六条边(A-BB-DC-DF-GA-DF-G)
第二组:
四个顶点(0123)三条边(0-10-20-3)
实验六图的应用
一实验要求:
已知一个有向图,试编程判断该图是否存在回路。
二:
算法设计:
(1)用到的结构:
逻辑结构(循环结构,条件结构,顺序结构)
存储结构(邻接表)
(2)算法设计思路:
创建表节点typedef struct ArcNode还有头结点typedef struct VNode。
从而创建一个有向图void CreateDG(ALGraph &G),同时返回顶点在图中的位置int LocateVex(ALGraph G, string u)。
紧接着求顶点的入度void FindIndegree(ALGraph G, int indegree[]),采用拓扑排序的方法void TopologicalSort(ALGraph G),入度为0的入队,出对后每个邻接点入度减1。
最后判断该图是否有回路if(count 三: 调试和测试: (1)调试过程总结: 在构造无向图的基础上添加一些代码成为有向图。 一开始不知道怎么判断是否有回路,问了同学才知道。 (2)三组测试数据及实验结果: 第一组: 无回路 第二组: 有回路 实验总结: 上课听老师讲的自己也懂,到自己写的时候就不知道怎么做了。 还是有的忘记定义。 自己还是不太会写main()方法。 老师每次试验基本都给我们写一些代码,让我们进行参考。 自己看着那些程序还是稍微有些不懂,在同学的指导下把一些不会的理解了。 但是到自己再次看的时候还是忘记了。 还是要多加练习啊。 最后在同学的帮助下,完成了实验。 附录: 源程序 实验四源代码: #include //#include #defineINFINITY32767 #defineMAX_VEX20//最大顶点个数 #defineQUEUE_SIZE(MAX_VEX+1)//队列长度 usingnamespacestd; bool*visited;//访问标志数组 //图的邻接矩阵存储结构 typedefstruct{ char*vexs;//顶点向量 intarcs[MAX_VEX][MAX_VEX];//邻接矩阵 intvexnum,arcnum;//图的当前顶点数和弧数 }Graph; //队列类 classQueue{ public: voidInitQueue(){ base=(int*)malloc(QUEUE_SIZE*sizeof(int)); front=rear=0; } voidEnQueue(inte){ base[rear]=e; rear=(rear+1)%QUEUE_SIZE; } voidDeQueue(int&e){ e=base[front]; front=(front+1)%QUEUE_SIZE; } public: int*base; intfront; intrear; }; //图G中查找元素c的位置 intLocate(GraphG,charc){ for(inti=0;i if(G.vexs[i]==c)returni; return-1; } //创建无向网 voidCreateUDN(Graph&G){ inti,j,w,s1,s2; chara,b,temp; printf("输入顶点数和弧数: "); scanf("%d%d",&G.vexnum,&G.arcnum); temp=getchar();//接收回车 G.vexs=(char*)malloc(G.vexnum*sizeof(char));//分配顶点数目 printf("输入%d个顶点.\n",G.vexnum); for(i=0;i printf("输入顶点%d: ",i); scanf("%c",&G.vexs[i]); temp=getchar();//接收回车 } for(i=0;i for(j=0;j G.arcs[i][j]=INFINITY; printf("输入%d条弧.\n",G.arcnum); for(i=0;i printf("输入弧%d: ",i); scanf("%c%c%d",&a,&b,&w);//输入一条边依附的顶点和权值 temp=getchar();//接收回车 s1=Locate(G,a); s2=Locate(G,b); G.arcs[s1][s2]=G.arcs[s2][s1]=w; } } //图G中顶点k的第一个邻接顶点 intFirstVex(GraphG,intk){ if(k>=0&&k for(inti=0;i if(G.arcs[k][i]! =INFINITY)returni; } return-1; } //图G中顶点i的第j个邻接顶点的下一个邻接顶点 intNextVex(GraphG,inti,intj){ if(i>=0&&i for(intk=j+1;k if(G.arcs[i][k]! =INFINITY)returnk; } return-1; } //深度优先遍历 voidDFS(GraphG,intk){ inti; if(k==-1){//第一次执行DFS时,k为-1 for(i=0;i if(! visited[i])DFS(G,i);//对尚未访问的顶点调用DFS } else{ visited[k]=true; printf("%c",G.vexs[k]);//访问第k个顶点 for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i)) if(! visited[i])DFS(G,i);//对k的尚未访问的邻接顶点i递归调用DFS } } //广度优先遍历 voidBFS(GraphG){ intk; QueueQ;//辅助队列Q Q.InitQueue(); for(inti=0;i if(! visited[i]){//i尚未访问 visited[i]=true; printf("%c",G.vexs[i]); Q.EnQueue(i);//i入列 while(Q.front! =Q.rear){ Q.DeQueue(k);//队头元素出列并置为k for(intw=FirstVex(G,k);w>=0;w=NextVex(G,k,w)) if(! visited[w]){//w为k的尚未访问的邻接顶点 visited[w]=true; printf("%c",G.vexs[w]); Q.EnQueue(w); } } } } //主函数 voidmain(){ inti; GraphG; CreateUDN(G); visited=(bool*)malloc(G.vexnum*sizeof(bool)); printf("\n广度优先遍历: "); for(i=0;i visited[i]=false; DFS(G,-1); printf("\n深度优先遍历: "); for(i=0;i visited[i]=false; BFS(G); printf("\n程序结束.\n"); } 实验五源代码 #include #include #include usingnamespacestd; //表结点 typedefstructArcNode{ intadjvex;//该弧所指向的顶点的位置 ArcNode*nextarc; }ArcNode; //头结点 typedefstructVNode{ stringdata;//顶点信息 ArcNode*firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针 }VNode,AdjList[10]; typedefstructALGraph{ AdjListvertices; intvexnum,arcnum; }ALGraph; intLocateVex(ALGraphG,stringu){//返回顶点u在图中的位置 for(inti=0;i if(G.vertices[i].data==u) returni; return-1; } voidCreateDG(ALGraph&G){//构造有向图 stringv1,v2; inti,j,k; cout<<"请输入顶点数和边数: "; cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点: "; for(i=0;i cin>>G.vertices[i].data; G.vertices[i].firstarc=NULL; } cout<<"请输入边: "< for(k=0;k cin>>v1>>v2; i=LocateVex(G,v1); j=LocateVex(G,v2); ArcNode*arc=newArcNode; arc->adjvex=j; arc->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=arc; } } voidFindIndegree(ALGraphG,intindegree[]){//求顶点的入度 for(inti=0;i indegree[i]=0; for(i=0;i ArcNode*p=G.vertices[i].firstarc; while(p){ indegree[p->adjvex]++; p=p->nextarc; } } } voidTopologicalSort(ALGraphG){//拓扑排序 queue intindegree[10]={0};//入度数组 intcount=0;//计数,计入队数 FindIndegree(G,indegree); for(inti=0;i if(0==indegree[i]) q.push(i); while(! q.empty()){ intv=q.front(); q.pop(); count++; cout< ArcNode*p=G.vertices[v].firstarc; while(p){//出队后,每个邻接点入度减1 if(! (--indegree[p->adjvex])) q.push(p->adjvex);//入度为0的顶点入队 p=p->nextarc; } } if(count cout<<"该有向图有回路"< } voidmain(){ ALGraphG; CreateDG(G); cout<<"拓扑排序: "; TopologicalSort(G); cout< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 操作 应用