4013基于深度优先搜索的两顶点路径存在与否的判断
描述
设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存在由顶点vi
输入
多组数据,每组m+3数据行。第一行有两个数字n和m,代表有n个顶点和m条边。第二行有n个字符,代表n个顶点的编号。第三行到第m+2行每行有两个字符h和k,代表边依附的两个顶点。第m+3行有两个字符vi和vj,代表需要判断的两个顶点。当n和m都等于0时,输入结束。
输出
每组数据输出一行。若存在路径输出“YES”,反之输出“NO”。
输入样例 1
3 2 abc ab bc ac 4 2 bcsw bs sw cs 0 0
输出样例 1
YES NO
//基于深度优先搜索的两顶点路径存在与否的判断
#include <iostream>
#define MVNum 100
using namespace std;
typedef struct ArcNode{//边信息 char p;//顶点 ArcNode *nextarc; //下一条边
}ArcNode,*ArcList;
typedef struct VNode{//顶点信息char name;//存储顶点的代号 ArcNode *ArcList;//指向第一条依附于他的边
}VNode,AdjList[MVNum];//如果此处用链表不好随时调用某顶点的信息
typedef struct{AdjList vertices;//图的本体 int vexnum,arcnum;//图的当前顶点数和边数
}ALGraph;
void Create_V(ALGraph &G,char name){//构造顶点 输入逻辑地址int pos=++G.vexnum; G.vertices[pos-1].name=name;//vexnum是逻辑地址,所以-1G.vertices[pos-1].ArcList=NULL;
}
void Create_Arc(ALGraph &G,char h,char k){//构造边int posh=0,posk=0;for(int i=1;i<=G.vexnum;i++){//查找左右顶点的逻辑地址if(h==G.vertices[i-1].name) posh=i;if(k==G.vertices[i-1].name) posk=i;}if(posh*posk==0) return;//此处删去也行 题目没做要求 如果边的点不在图中 退出ArcNode *ph=new ArcNode;//h的新邻接点ArcNode *pk=new ArcNode;//p的新邻接点ph->p=k;//p新邻接点的名字ph->nextarc=G.vertices[posh-1].ArcList;//前插法G.vertices[posh-1].ArcList=ph;pk->p=h;//h新邻接点的名字pk->nextarc=G.vertices[posk-1].ArcList;//前插法G.vertices[posk-1].ArcList=pk;G.arcnum++;
}
void DFS(ALGraph &G,int been[],ArcList p,char end){while(p){int pos;//p结点的位置for(int i=1;i<=G.vexnum;i++)//查找p所在位置 if(p->p==G.vertices[i-1].name) {pos=i;break;}if(been[pos-1]==0){//如果p没有被遍历过,就让他入been。然后对他进行DFS been[pos-1]=1;DFS(G,been,G.vertices[pos-1].ArcList,end);}p=p->nextarc;}
}
void Calculate(int m,int n){ALGraph G;G.vexnum=G.arcnum=0;for(int i=1;i<=m;i++){//构造前n个顶点char s;cin>>s;Create_V(G,s);}for(int i=1;i<=n;i++){//构造n条边 char h,k;cin>>h>>k;//输入左右顶点 Create_Arc(G,h,k);//构造边 }int been[G.vexnum]={0};//记录经过的点 char begin,end;//起点终点 int pbegin;//起点位置 cin>>begin>>end;for(int i=1;i<=G.vexnum;i++)//查找起点所在的位置 if(G.vertices[i-1].name==begin){pbegin=i;break;}been[pbegin-1]=1;DFS(G,been,G.vertices[pbegin-1].ArcList,end);for(int i=1;i<=G.vexnum;i++)//查找end所在位置 if(G.vertices[i-1].name==end){if(been[i-1]==1) cout<<"YES"<<endl;else cout<<"NO"<<endl;break;}
}
int main(){int m,n;while(cin>>m>>n&&m!=0&&n!=0){//每次处理一组数据 Calculate(m,n);}return 0;
}
4013基于深度优先搜索的两顶点路径存在与否的判断相关推荐
- BJFU_数据结构习题_284基于深度优先搜索的两顶点路径存在与否的判断
欢迎登录北京林业大学OJ系统 http://www.bjfuacm.com 284基于深度优先搜索的两顶点路径存在与否的判断 描述 设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存 ...
- 4013-基于深度优先搜索的两顶点路径存在与否的判断(C++,附详细思路)
描述 设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存在由顶点vi 输入 多组数据,每组m+3数据行.第一行有两个数字n和m,代表有n个顶点和m条边.第二行有n个字符,代表n个顶点 ...
- 无向图、深度优先搜索(无向图)、广度优先搜索(无向图)、无向图路径查找(基于深度优先搜索)
一.无向图 1.1 图的相关术语 相邻顶点: 当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点. 度: 某个顶点的度就是依附于该顶点的边的个数. 子图: 是一幅图的所 ...
- 基于深度优先搜索回溯法的人狼羊菜过河模型
基于深度优先搜索回溯法的人狼羊菜过河模型 本文介绍一个农夫过河的小模型,算法 Python 实现,感觉还挺有趣的,因原为笔者课程作业论文改版而来,所以文章内容比起其他博客文章可能会比较严肃与严谨.期待 ...
- (国赛B题)沙漠掘金——基于深度优先搜索的沙漠掘金游戏策略求解(上)
摘要 穿越沙漠游戏是一个由单人或多人玩家在一定的游戏参数设定之下,综合考虑行走路径,移动策略以及购买策略以实现最终收益最大化的项目,本文主要从最优移动策略的性质出发讨论如何快速计算寻找所有可能路径,以 ...
- 基于深度优先搜索的填字游戏解决方法
题目:□□□+□□□=□□□,□中可填入数字1-9,输出所有可能的结果,统计个数 <span style="font-size:18px;">package match ...
- 基于冲突搜索的多机器人路径规划(Matlab代码实现)
目录
- 深入浅出,详解深度优先搜索(DFS)
深度优先搜索 如果把深度优先搜索比作一个人的话,那么这个人是一个执着的人,甚至倔强,不把一条路走到底不会返回(回溯),虽然执着倔强,但是他不傻,如果在探索的途中发现这条路走下去没有希望他会提前返回(剪 ...
- 图的深度优先搜索及拓扑排序
本文将介绍图的深度优先搜索,并实现基于深度优先搜索的拓扑排序(拓扑排序适用于有向无环图,下面详细介绍). 1. 图的深度优先遍历要解决的问题 图的深度优先搜索与树的深度优先搜索类似,但是对图进行深度优 ...
最新文章
- R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(自定义边界调色板、brewer调色板、比例灰度)实战
- 平流式隔油池计算_广州隔油池清理公司讲述清理隔油池程序和标准_新闻中心...
- smarty学习——编程知识
- 专访赵加雨:WebRTC在网易云信的落地
- 9.Tornado下的一个简易Blog--2013-05-21
- linux运维决心书!
- python预处理标准化_tensorflow预处理:数据标准化的几种方法
- jsp中获取list长度
- python队列及其实现
- leetcode题解131-分割回文串
- 如何解决“呈现控件时出错”的问题(转)
- 无法上网之NOD32
- java 大端 小端 转换_Java 大小端转换(基于ByteBuffer)
- 回溯 + 剪枝 无重复元素的数组 candidates 和一个目标数 target 数字可以无限制重复被选取
- ROS入门之——浅谈launch
- 数据库和SpringBoot
- idea调试代码错误_通过调试进行指导:如何将代码错误转化为学习经验
- Kali之——菜单中各工具功能
- ORA-1628: max # extents 32765 reached for rollback segment 错误处理
- 全站仪外业测绘数据导入CAD图中技巧