描述

一个连通图采用邻接表作为存储结构。设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径。

输入

多组数据,每组m+3数据行。第一行有两个数字n,m和k,代表有n个顶点,m条边和长度k。第二行有n个字符,代表n个顶点的编号。第三行到第m+2行每行有两个字符h和p,代表边依附的两个顶点。每条边的长度为1。第m+3行有两个字符d和f,代表需要判断的两个字符。

输出

每组数据输出一行。若存在路径输出“YES”,反之输出“NO”。

输入样例 1

3 2 2
abc
ab
bc
ac
4 2 5
bcsw
bs
sw
bw
0 0 0

输出样例 1

YES
NO

思路:

邻接表的建立等基本操作在这篇文章里有写,所以下面就不赘述了~

4003基于邻接表的新顶点的增加(C++,附详细解析)_鹤天寻的博客-CSDN博客https://blog.csdn.net/qq_54416938/article/details/121582300?spm=1001.2014.3001.5501

用到了一个全局map,map用来存储每个节点所对应的序号节点,比如说abc来建立邻接表,a对应1,b对应2,c对应3,那么就把他们都存在map里,之后再用这个输入的字符串初始化邻接表。

接着逐个输入字符串,借助map的迭代器来找到当前节点对应在邻接表里的序号,建立邻接表。

之后就是寻找路径了,设置一个计步器len,每走过一步就让len++,若当前走完了,就以最后的节点为起点在邻接表里继续遍历,直到到达目标节点为止,比较len和k的值,相等就是YES,否则就输出NO。

我认为精彩之处在于

            pos = GetPos(p->data);
            p = &alg.VList[pos];

这两句代码以及借助map的思想,这样就达到了“循环遍历”的效果。

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<set>
#include<map>
using namespace std;
map<char, int> mp;
typedef struct LNode
{char data;struct LNode* next;
}*linklist, LNode;
typedef struct
{int arcnum;int vexnum;linklist VList;
}ALGraph;
void Create(ALGraph& alg, int n, int m)
{alg.arcnum = m;alg.vexnum = n;alg.VList = new LNode[n + 1];string ves;cin >> ves;for (int i = 0; i < ves.length(); i++)mp[ves[i]] = i + 1;int j = 0;for (int i = 1; i <= n; i++){alg.VList[i].data = ves[j++];alg.VList[i].next = NULL;}map<char, int>::iterator it = mp.begin();for (int i = 0; i < m; i++){string t;cin >> t;linklist p = new LNode;p->data = t[1];while (it != mp.end()){if (it->first == t[0]){p->next = alg.VList[it->second].next;alg.VList[it->second].next = p;break;}it++;}}
}
int GetPos(char c)
{map<char, int>::iterator it = mp.begin();int pos = 0;while (it != mp.end()){if (it->first == c){pos = it->second;break;}it++;}return pos;
}
void Find(ALGraph alg,int k)
{string t;cin >> t;int pos = GetPos(t[0]);linklist p = &alg.VList[pos];int len = 0;while (p){len++;p = p->next;if (p->data == t[1])break;else{pos = GetPos(p->data);p = &alg.VList[pos];}}if (len != k)cout << "NO" << endl;elsecout << "YES" << endl;
}
int main()
{int m, n, k;while (cin >> n >> m >>k&& m != 0 && n != 0&&k!=0){ALGraph a;Create(a, n, m);Find(a, k);}return 0;
}

4014-基于邻接表的长度为k的简单路径的求解(C++,附思路)相关推荐

  1. 4014基于邻接表的长度为k的简单路径的求解

    描述 一个连通图采用邻接表作为存储结构.设计一个算法,判断无向图中任意给定的两点是否存在一条长度为k的简单路径. 输入 多组数据,每组m+3数据行.第一行有两个数字n,m和k,代表有n个顶点,m条边和 ...

  2. 3006基于二叉链表的二叉树最长路径的求解(附思路)

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为 ...

  3. 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。

    以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j). 问题描述:试基于图的深度优先搜索策略编写一程序,判别以邻接表存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i!=j). 输入 ...

  4. 4005基于邻接表的顶点的删除(C++,附思路)

    描述 给定一个无向图,在此无向图中删除一个顶点. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的两 ...

  5. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

  6. 【 第11关:基于邻接表的深度优先遍历】【编程题实训-图】【头歌】【bjfu-282】

    任务描述 一个连通图采用邻接表作为存储结构.设计一个算法,实现从顶点v出发的深度优先遍历的非递归过程. 编程要求 输入 多组数据,每组m+2数据行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点 ...

  7. 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< ...

  8. C++笔记-基于邻接表的BFS(宽度优先遍历)

    这里是基于邻接表的,有向的,具体代码如下: #include <iostream> #include <list>using namespace std;class Graph ...

  9. 4003基于邻接表的新顶点的增加(C++,附详细解析)

    描述 给定一个无向图,在此无向图中增加一个新顶点. 输入 多组数据,每组m+2行.第一行有两个数字n和m,代表有n个顶点和m条边.顶点编号为1到n.第二行到第m+1行每行有两个数字h和k,代表边依附的 ...

最新文章

  1. html页面多个按钮点击事件监听事件,HTML Button.onclick 事件汇总
  2. python图像插值
  3. 数据库性能检查指导方案
  4. ios 持续获取定位 高德地图_概述-iOS 定位SDK | 高德地图API
  5. 1.jstl之SQL:setDataSource
  6. 使用dup2实现重定向到屏幕终端遇到问题
  7. Winfrom实现圆角设计
  8. LeetCode 800. 相似 RGB 颜色
  9. Google IO 2015 Material Now
  10. java发送lrc文件格式_基于java的lrc歌词文件解析工具
  11. 国际快递中常见的国家省份名称中英文对照表
  12. L314 单音节词读音规则(二)-元音字母发音规则
  13. uniapp字体图标的使用
  14. 怎么组织计算机更新,win10更新取消组织管理提示怎么取消_win10更新提示某些设置由你的组织管理的解决步骤...
  15. 日文个别难打的假名打法总结
  16. 位运算的奇技淫巧:Bit Twiddling Hacks
  17. 测试工程师转开发希望大吗?
  18. nodejs简单介绍
  19. 外网连接mysql数据库(花生壳 内网穿透)
  20. 发邮件时提示连接服务器失败,发送邮件时经常出现发送失败或是连接超时什么原因...

热门文章

  1. python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法
  2. MySQL笔记(一)创建数据库、创建表、修改表、删除表,以及建立约束
  3. 小汤学编程之JAVA基础day07——面向对象(二):封装、继承与多态
  4. 猴子选大王--约瑟夫问题浅析
  5. 1.视频压缩编码综述
  6. DevExpress控件使用小结
  7. 修改折半查找算法进行范围查找
  8. IDEA中配置Python环境并运行
  9. Flutter TextField 边框样式以及提示文本 、Flutter输入文本TextField
  10. ios 内存管理的理解(二)ARC概念及原理