博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用dfs实现图中有无环的查询
阅读量:4144 次
发布时间:2019-05-25

本文共 2754 字,大约阅读时间需要 9 分钟。

先上代码

//好了接下来是我自己写的...难得能自己这么快乐的打代码的时光珍惜吧= -//一种又要抄高数作业的节奏....所以我之前是在干嘛?//所以我要是直接不写高数作业不就完全ojbk了#include
#include
using namespace std; const int mn = 10005; //*****要加constint vis[mn];//0就是没访问过就是NO 1就是访问过就是YES int u; int v;//u和v定义到里面还是有问题.....vector
g[mn];int bfs(int x,int fa){ vis[x] = 1; for (int i = 0; i < g[x].size(); i++) { int k = g[x][i]; ******以及!!!vector这个数组也是有点毛病,是g[x][i],前面是对应的第几个坐标,后面是这个//后面是这个坐标里面的第几个数据,你加了几个啦...什么的 ********** *****非常重要的一点啊!那就是爸爸这个你既然传进来想用了 就要排除这个特殊情况,因为它算作是多数了,不算的! if(k != fa) { if (vis[k] || bfs(k, x) == 1) return 1; } //回去的时候就会不断的叠加..叠加,....知道跌回最后一个0输出了.over!是不是非常完美! //**这里是或者...活着就是只要有一个满足了这个玩意儿 //要么被访问过 或者你一条路走到黑 你道儿上的人也犯过事儿 那你就滚了 } //here we know if it returuns 0 is no //and 1 is yes return 0;//if there is nothing //平安运行就是0啊= -}int main(){ int m, n; cin >> n >> m; for (int i = 1; i <= m; i++)//(等于号,小错误不要翻 {cin>>u>>v; g[u].push_back(v); g[v].push_back(u); //初始化工作是把两个都加进去对吧= } if (bfs(1, 0) == 1)cout << "NO"; else cout << "YES";//0 is无 //1就是又换= - return 0;}
 
//dfs(1,0) 之后继续, 爸爸是0,1里面只有一个2,访问2
用爸爸来限制吧.. 如果你是又访问到一次,那你就是有环
并且,一个是x,一个是i啊
这个x是初始的,i是你读入的g[x]  i里面那一堆.,, = =
因为,还是搜索吗,所以dfs的时候,你最开始push进来的这几条边,我都要跑他一炮
炮的时候,每次遇到不合格的...
不合格的就是(之前已经用过了一次!)
或者你没用到,但是你跑到别人家的bfs里面 去!
(因为循环调用的嘛,深度优先,所以一条路走到黑了)
跑到人家的dfs里面去,直到逼得他最后一步都无路可走(并且还没有退出)就表明,一路上的dfs都是安全通过的....
****这和bfs其实一样的吗...bfs就是啥都不管,有啥先都扔进去,那bfs就是一条路走到黑,不停的在递归递归递归递归
bfs就是你不满足就滚,满足就继续跟我递归
直到不能递归了,返回一个很安全的路径,那就是这个题里面return 1(zj说写错了,反正就是无环)
//
可以说是分块的啊....  其实循环调用的话一直在里面dfs也还好,毕竟是在相互调用,里面完了就出结果了
如果还是那种真的分的很开的,那就分开调用嘛.
g[x],从(1,0)跑没了,安全,不要怕,我们....
不对....要怕了,从(1,0)跑完了,就没了啊...
所以吧....所以,如果是判断什么连通快的,就不能用了,
这个代码适合的是一条路走到黑的类型,因为它是一条通路呀,通路里面如果(在去除了爸爸之后)有另外的循环出现,那就是有环图...
***另,对于  3 4  4 3 这种直接自己和自己相连 的似乎就已经没法判断了,因为你是从爸爸那里来到的,所以上述代码是(去除了直接34  43这种之后的,大环的有无爸爸情况的代码)
*** 3 4  4 3 这种呢,我们直接用vector来判断就好了
加的时候  v.push_back(u);  u.push_back(v);
那么加的时候直接加了两次啊...   4 4  
sort一下,如果有重复的就输出= -  需要先这么预处理一下,还是挺快的吧...
***还有一个问题就是,这个是用..
[邻接表]啊,也就是 vector<T>  g[mn]来实现的(命名规则而已...其实也就是m吧)
g[1]她们一开始数据块范围都挺小的 然后你把它打压进去
g[2]有几个他能访问到的点 这个vector数据范围就多大
***其他的一些
n是点数  m是边数(边数是输入的时候用的,相当于输入了2m个嘛)
n有用啊,,,,大概g[mn]里面这么多,下一次再使用需要清空的时候就clear一下,over
***怎么写了这么多= -
***大概和dfs一样需要【提炼一下步骤以免忘了】
【抽象模板的话就是】
对于这种是否是有向图 的问题。。。。
1.读入边(两个点),分别塞入向量(邻接表)2次
2.bfs:bfs的话!
(1)首先,需要记忆一下【爸爸】
(2)进来之后标记成1(已经访问过)
(3)对于搞到x这个数组里面的所有k都访问一遍
(就是k=g[x][i])
(4)k的话特别注意一下排除等于爸爸的问题(误判(k!=fa))
(5)如果你vist或者是bfs下一个穷追不舍等于1了都会推出
(6)循环一样的往下跑就好了
3.如果返回1,就是NO
【再总结一下的话就是】
/1肚入边/2小范围:访问标记/3搞进去的数组清洗干净
/4小范围:搞进去的数组/5 搞进去的数组不等于爸爸,没访问过,或者道上的人
也就是两个小嵌套啦

最后感谢大家哦(鞠躬)

zj的原代码= -我似乎写错了

#include
using namespace std;/*dfs判断无向图是否有环 */ const int mn=1e5+5;int n,m;//the number of pointvector
g[mn]; bool vis[mn];int dfs(int x,int fa){ vis[x]=1; for(int i=0;i

转载地址:http://zquti.baihongyu.com/

你可能感兴趣的文章
年薪50万+的90后程序员都经历了什么?
查看>>
2019年哪些外快收入可达到2万以上?
查看>>
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>
我在网易做了6年前端,想给求职者4条建议
查看>>
SQL1015N The database is in an inconsistent state. SQLSTATE=55025
查看>>
RQP-DEF-0177
查看>>
MySQL字段类型的选择与MySQL的查询效率
查看>>
Java的Properties配置文件用法【续】
查看>>
JAVA操作properties文件的代码实例
查看>>
IPS开发手记【一】
查看>>
Java通用字符处理类
查看>>
文件上传时生成“日期+随机数”式文件名前缀的Java代码
查看>>
Java代码检查工具Checkstyle常见输出结果
查看>>
北京十大情人分手圣地
查看>>
Android自动关机代码
查看>>
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>