2015年大二上-数据结构-图-1-(4)-利用遍历思想求解图问题(1)
2016-01-24 22:28
495 查看
1、是否有简单路径?
问题:假设图G采用邻接表存储,设计一个算法,判断顶点u到v是否有简单路径。
2、输出简单路径
问题:假设图G采用邻接表存储,设计一个算法输出图G中从顶点u到v的一条简单路径(假设图G中从顶点u到v至少有一条简单路径)。
3、输出所有路径
问题:输出从顶点u到v的所有简单路径。
4、输出一些简单回路
问题:输出图G中从顶点u到v的长度为s的所有简单路径。
5、输出通过一个节点的所有简单回路
问题:求图中通过某顶点k的所有简单回路(若存在)
附:测试用图结构
G1
![](https://oscdn.geek-share.com/Uploads/Images/Content/201601/b8010ac729174cfb18bab79f840c397b)
G2
![](https://oscdn.geek-share.com/Uploads/Images/Content/201601/b730ee64212aa20ad6f142ccf9241e0d)
G3
![](https://oscdn.geek-share.com/Uploads/Images/Content/201601/5ff7eb4cde13ab812495cd92f9da2709)
运行结果:
问题:假设图G采用邻接表存储,设计一个算法,判断顶点u到v是否有简单路径。
2、输出简单路径
问题:假设图G采用邻接表存储,设计一个算法输出图G中从顶点u到v的一条简单路径(假设图G中从顶点u到v至少有一条简单路径)。
3、输出所有路径
问题:输出从顶点u到v的所有简单路径。
4、输出一些简单回路
问题:输出图G中从顶点u到v的长度为s的所有简单路径。
5、输出通过一个节点的所有简单回路
问题:求图中通过某顶点k的所有简单回路(若存在)
/* *Copyright (c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:Annpion.cpp *作者:王耀鹏 *完成日期:2016年1月24日 *版本号:v1.0 * *问题描述:利用遍历思想求解图问题 *输入描述:无 *输出描述:无 */ #include <stdio.h> #include <malloc.h> #include "Graph.h" int visited[MAXV]; void ExistPath(ALGraph *G,int u,int v, bool &has)//是否有简单路径 { int w; ArcNode *p; visited[u]=1; if(u==v) { has=true; return ; } p=G->adjlist[u].firstarc; while(p!=NULL) { w=p->adjvex; if(visited[w]==0) ExistPath(G,w,v,has); p=p->nextarc; } } void HasPath(ALGraph *G,int u,int v) { int i; bool flag=false; for(i=0; i<G->n; ++i) visited[i]=0; ExistPath(G,u,v,flag); printf(" 从 %d 到 %d ", u, v); if(flag) printf("有简单路径\n"); else printf("无简单路径\n"); } void FindAPath(ALGraph *G,int u,int v,int path[],int d)//输出简单路径 { int w; ArcNode *p; visited[u]=1; ++d; path[d]=u; if(u==v) { printf("一条简单路径:"); for(int i=0; i<=d; ++i) printf("%d ",path[i]); printf("\n"); return ; } p=G->adjlist[u].firstarc; while(p!=NULL) { w=p->adjvex; if(visited[w]==0) FindAPath(G,w,v,path,d); p=p->nextarc; } } void APath(ALGraph *G,int u,int v) { int path[MAXV]; for(int i=0; i<G->n; ++i) visited[i]=0; FindAPath(G,u,v,path,-1); } void FindPaths(ALGraph *G,int u,int v,int path[],int d)//输出所有路径 { int w,i; ArcNode *p; visited[u]=1; d++; path[d]=u; if (u==v && d>1) { printf(" "); for (i=0; i<=d; i++) printf("%d ",path[i]); printf("\n"); } p=G->adjlist[u].firstarc; while(p!=NULL) { w=p->adjvex; if (visited[w]==0) FindPaths(G,w,v,path,d); p=p->nextarc; } visited[u]=0; } void DispPaths(ALGraph *G,int u,int v) { int i; int path[MAXV]; for (i=0; i<G->n; i++) visited[i]=0; printf("从%d到%d的所有路径:\n",u,v); FindPaths(G,u,v,path,-1); printf("\n"); } void SomePaths(ALGraph *G,int u,int v,int s, int path[],int d)//输出一些简单回路 { int w; ArcNode *p; visited[u]=1; ++d; path[d]=u; if(u==v&&d==s) { printf(" "); for(int i=0; i<=d; ++i) printf("%d ",path[i]); printf("\n"); } p=G->adjlist[u].firstarc; while(p!=NULL) { w=p->adjvex; if(visited[w]==0) SomePaths(G,w,v,s,path,d); p=p->nextarc; } visited[u]=0; } void DispSomePaths(ALGraph *G,int u,int v, int s) { int i; int path[MAXV]; for (i=0; i<G->n; i++) visited[i]=0; printf("从%d到%d长为%d的路径:\n",u,v,s); SomePaths(G,u,v,s,path,-1); printf("\n"); } void DFSPath(ALGraph *G,int u,int v,int path[],int d)//输出通过一个节点的所有简单回路 { int w,i; ArcNode *p; visited[u]=1; d++; path[d]=u; p=G->adjlist[u].firstarc; while (p!=NULL) { w=p->adjvex; if (w==v && d>0) { printf(" "); for (i=0; i<=d; i++) printf("%d ",path[i]); printf("%d \n",v); } if (visited[w]==0) DFSPath(G,w,v,path,d); p=p->nextarc; } visited[u]=0; } void FindCyclePath(ALGraph *G,int k) { int path[MAXV],i; for (i=0; i<G->n; i++) visited[i]=0; printf("经过顶点%d的所有回路\n",k); DFSPath(G,k,k,path,-1); printf("\n"); } int main() { ALGraph *G1,*G2,*G3; int A[5][5]= { {0,0,0,0,0}, {0,0,1,0,0}, {0,0,0,1,1}, {0,0,0,0,0}, {1,0,0,1,0}, }; int B[5][5]= { {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 C[5][5]= { {0,1,1,0,0}, {0,0,1,0,0}, {0,0,0,1,1}, {0,0,0,0,1}, {1,0,0,0,0} }; ArrayToList(A[0], 5, G1); ArrayToList(B[0], 5, G2); ArrayToList(C[0], 5, G3); HasPath(G1, 1, 0); HasPath(G1, 4, 1); APath(G1, 1, 0); APath(G1, 4, 1); DispPaths(G2, 1, 4); DispSomePaths(G2, 1, 4, 3); FindCyclePath(G3, 0); return 0; }
附:测试用图结构
G1
G2
G3
运行结果:
相关文章推荐
- 数据结构(寒假小结)——2.线性表
- 小蚂蚁学习数据结构(23)——伪代码中的引用
- PHP——数组和数据结构
- LeetCode12. Integer to Roman不用任何数据结构和数组
- 查找链表倒数第K个节点
- 再看数据结构之KMP匹配
- 数据结构与算法——二叉树高度(C语言)
- 数据结构与算法知识大纲
- 数据结构基础(四)树和二叉树
- 数据结构实现之索引优先队列用例(多路归并)
- 数据结构实现之最大索引优先队列
- 数据结构实现之最小索引优先队列
- Eigen库数据结构内存对齐问题
- 【Redis笔记(四)】 Redis数据结构 - list链表
- HDU1022 Train Problem I 数据结构
- 数据结构与算法——在一个数组中实现两个堆栈(C语言)
- 数据结构实验之栈三:后缀式求值
- 已知后序中序序列求先序序列
- 对于二叉树三种非递归遍历方式的理解
- 2015年大二上-数据结构-图-1-(3)图遍历算法实现