首页 > 编程知识 正文

七桥问题被解决了吗,哥尼斯堡七桥问题知识点

时间:2023-05-03 19:05:04 阅读:156934 作者:1819

在问题解决中使用了dfs和bfs

在“七桥问题”中发现这个问题有两个

1 .与一个节点的连接是否为偶数

2 .有无断裂

首先把vector双重记录下来

制作bool型载体作为是否通过这条路的标志

用check判断是否为偶数,然后用dfs或bfs再次进行,再判断是否全部进行

可以深入搜索dfs法,更深入地搜索,使用有点贪心的算法马上就去

一次通过所有的路后用bool型的vector标记

每次去某个点都会去看他的子节点,也就是他连接到哪里。 如果子节点经过,则跳过其子节点。 否则,前往下一个层次的dfs,然后前往原始子节点的子节点,即当前位置的子节点。

广域检索bfs法//假设有空的检索队列Queue,首先将节点a追加到队列Queue中

//判断队列的第一个节点是否是要查找的目标节点,否则,将第一个节点的直接子节点添加到队列中,然后删除第一个节点

//重复判断,直到第一个节点成为目标节点或队列为空(即意味着没有合适的节点)

其实在所有的节点上再走一次

假设您第一次去的是一个节点,然后将它标记为已经去过

使用循环结束条件的是所有节点都被访问了

将当前节点的子节点按顺序循环排队

从所有的子节点中选择不走的节点去

队列持续增加的是,新未行走的节点行走后,将标记放平,从队列中排除

深搜和广搜只是改变了函数,其他没有变化

代码中写的访问的第一个节点都是1,其实多少都可以,反正他们之间是联系在一起的

# include vector # include queue # includeiostreamusingnamespacestd; vectorvectorint g; vectorbool visited; int n,m; 输入检查(; voidDFS(intx ); //如果有空的搜索队列Queue,则首先在队列Queue中添加节点a//判断队列的第一个节点是否为要搜索的目标节点,否则将第一个节点的直接子节点添加到队列中,第一个节点为目标节点//首先将节点1添加到队列visited[1]=true; //标志1已经被while (! q.empty () ) ) /队列空闲时停止)如果所有节点都已被访问) ({ auto x=q.front ) ); //检索队列的第一个节点q.pop (); //第一个for(autoI:g[x] ) /此节点的子节点(按顺序查看if )! visited[i]如果未访问(筛选已找到的节点),请单击q.push(I ); //则队列visited[i]=true; ///因为已经加入,所以打算进行访问} } }}int main () IOs:3360sync_with_stdio ) false ); //否则看生命可能会超时; g.resize(n1; //visited.resize(n1 ); //标记用while(m-- ) { int x,y; cin x y; g[x].push_back(y; //x链接y,但x并不一定只链接y,而是g[y].push_back(x ),其中x可以链接y并写下y; //即使是同一个y,进入x y的也想和y连接(} cout check ) ) endl; 返回0; (}int check ) ) for ) intI=1; i=n; I () if ) g[I].size(%2) /如果道路是偶数,则返回0; //DFS(1); bfs (; for(intI=1; i=n; I ) if (! visited[I](return0; //如果有未链接的东西不行return 1; ) voidDFS(intx )//贪婪算法如果可以的话就去) { visited[x]=true; //路过的话for(autoI:g[x] ) ) /按顺序看看能走哪条路(if (! visited[i]如果这条路通过了,DFS(I ); ()又沿着这条路走)调查道理也不会改变的,只是将横穿所有节点并列的方法

# include iostream # include vector # include numeric # includealgorithmusingnamespacestd; int n,m; vectorint to,p; intfind(intx ) /调查他的祖先(returnp ) x )==x? x:p[x]=find(p[x]; }int main () IOs :3360 sync _ with _ stdio (false ); cin n m; int t=n; p.resize(n1; //大小to.resize(n1 ); IOTA(p.Begin )、p.end )、0 ); for(intI=0; i m; I ) { int x,y; cin x y; to[x]; //记下他们的链接数量的to[y]; //从下开始一起x=find(x ),y=find(y ) y ); if(x!=y ()//如果在一起不是一个电路,则{ p[x]=y; T----; //记录合并次数) }for(intI=1; i=n; I ) ) ) /他的号码原本是(if(to[I]%2) ) /链接地址是否为奇数个的) { cout 0; 返回0; }if(t==1)//最后在一起的是否全部是cout 1; else cout '0'; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。