当前位置: 首页 > news >正文

福州网站建设设计学计算机哪个培训机构好

福州网站建设设计,学计算机哪个培训机构好,网站开发网站开发公司哪家好,中国建材建设网站文章目录1 概念2 API3 分析和实现4 测试5 总结后记1 概念 二分图是一种能将所有结点分为两部分的图#xff0c;其中图的每条边所连接的两个顶点都分别属于不同的部分。 2 API public classBipartiteBipartite(Graph G)预处理函数public booleanisBipartitle()是否是二分图pub… 文章目录1 概念2 API3 分析和实现4 测试5 总结后记1 概念 二分图是一种能将所有结点分为两部分的图其中图的每条边所连接的两个顶点都分别属于不同的部分。 2 API public classBipartiteBipartite(Graph G)预处理函数public booleanisBipartitle()是否是二分图public IterableIteratablecycle()如果不是二分图输出同色边所在环路public booleancolor(int v)输出顶点v的颜色 3 分析和实现 深度优先非递归实现源代码如下 package com.gaogzhen.datastructure.graph.undirected;import com.gaogzhen.datastructure.stack.Stack; import edu.princeton.cs.algs4.Graph;import java.util.Iterator;/*** 二分图* author: Administrator* createTime: 2023/03/10 19:27*/ public class Bipartite {/*** 标记顶点*/private boolean[] marked;/*** 记录所有顶点到起点的路径*/private int[] edgeTo;/*** 双色标记顶点颜色,true和false*/private boolean[] color;/*** 是否是二分图标志默认true*/private boolean isBipartite true;/*** 如果不是二分图记录形成同色边所在环*/private StackInteger cycle;/*** 染色法检测是否是二分图** param G the undirected graph*/public Bipartite(Graph G) {// 只是检测二分图可以不进行平行边的判断如果想找到形成同色边所在环则需要进行平行边的判断// if (hasParallelEdges(G)) {// return;// }// dont need special case to identify self-loop as a cycle// if (hasSelfLoop(G)) return;int len G.V();marked new boolean[len];color new boolean[len];edgeTo new int[len];for (int i 0; i len; i) {edgeTo[i] -1;}dfs(G);}private void dfs(Graph G) {StackNode stack new Stack();for (int v 0; v G.V(); v) {if (!marked[v]) {if (dfs(G, v, stack) ) {return;}}}}/*** 深度优先染色** param G 无向图* param v* param stack*/private boolean dfs(Graph G, int v, StackNode stack) {marked[v] true;IterableInteger adj G.adj(v);if (adj ! null) {stack.push(new Node(v,adj.iterator()));}while (!stack.isEmpty()) {Node c stack.pop();while (c.adj.hasNext()) {Integer w c.adj.next();if (!marked[w]) {marked[w] true;edgeTo[w] c.v;// 当前顶点染和其父结点相反的颜色color[w] !color[c.v];if (c.adj.hasNext()) {stack.push(c);}IterableInteger adjW G.adj(w);if (adjW ! null) {stack.push(new Node(w, adjW.iterator()));}break;}// check for cycle (but disregard reverse of edge leading to v)else if (color[w] color[c.v]) {// 记录同色边所在环路cycle new Stack();cycle.push(w);for (int x c.v; x ! w; x edgeTo[x]) {cycle.push(x);}cycle.push(w);isBipartite false;return true;}}}return false;}/*** 检测无向图G是否有子环* param G* return*/private boolean hasSelfLoop(Graph G) {for (int v 0; v G.V(); v) {for (int w : G.adj(v)) {if (v w) {cycle new StackInteger();cycle.push(v);cycle.push(v);return true;}}}return false;}/*** 检测无向图G是否有平行边* param G* return*/private boolean hasParallelEdges(Graph G) {marked new boolean[G.V()];for (int v 0; v G.V(); v) {// check for parallel edges incident to vfor (int w : G.adj(v)) {if (marked[w]) {cycle new StackInteger();cycle.push(v);cycle.push(w);cycle.push(v);return true;}marked[w] true;}// reset so marked[v] false for all vfor (int w : G.adj(v)) {marked[w] false;}}return false;}/*** 是否是二分图* return*/public boolean isBipartite() {return isBipartite;}public boolean color(int v) {validateVertex(v);if (!isBipartite) {throw new UnsupportedOperationException(graph is not bipartite);}return color[v];}private void validateVertex(int v) {int V marked.length;if (v 0 || v V) {throw new IllegalArgumentException(vertex v is not between 0 and (V-1));}}/*** 如果有环返回环路* return a cycle if the graph {code G} has a cycle,* and {code null} otherwise*/public IterableInteger cycle() {return cycle;}static class Node {/*** 顶点索引*/private int v;/*** 顶点邻接表*/private IteratorInteger adj;public Node(int v, IteratorInteger adj) {this.v v;this.adj adj;}} }原理深度优先遍历无向图遍历顶点v标记且颜色染为其父结点的反色。遍历顶点v邻接表顶点w时如果w已经被标记过且颜色和顶点v的颜色相同。说明边v-w为同色边不是二分图。重复上述过程如果遍历完整个无向图没有发现同色边说明该无向图为二分图且染色完毕。 记录同色边所在环edgeTo[]记录所有顶点到起点的路径为一棵由父链接表示的树。如果找到同色边v-w说明它一也形成了环路。变量从顶点v开始遍历树通过把x设为edgeTo[v]直到顶点w。容器起始放入顶点w最后放入w记录完整环路。 双色利用布尔值true和false表示通过逻辑非很容易取反色。 4 测试 测试代码 public static void testBipartite() {String path H:\\gaogzhen\\java\\projects\\algorithm\\asserts\\bipartite.txt;// String path H:\\gaogzhen\\java\\projects\\algorithm\\asserts\\maze.txt;In in new In(path);Graph graph new Graph(in);Bipartite bipartite new Bipartite(graph);System.out.println(是否是二分图 bipartite.isBipartite());System.out.println(非二分图环 bipartite.cycle()); }bipartite.txt中染色效果如下图4-1所示 maze.txt染色效果如下图4-2所示 5 总结 如果一幅图有环且环中顶点数为奇数那么它就不是二分图。 如果一幅图没有环那么深度优先遍历就是一棵树从起点开始把边两个顶点染不同的颜色一定是二分图。一幅图有环而且环中顶点数为奇数给顶点做标记1,2,…,2k1,k∈N1,2,\dots,2k1,k\in N1,2,…,2k1,k∈N。根据我们的染色规则那么第1和顶点和最后一个顶点由同一条边相连接且颜色相同。所以不是二分图。 广度优先搜索算法也可以解决二分图判别染色问题有兴趣的小伙伴自行实现吧也可以参考算法第四版对应jar包。 后记 如果小伙伴什么问题或者指教欢迎交流。 ❓QQ:806797785 ⭐️源代码仓库地址https://gitee.com/gaogzhen/algorithm 参考链接: [1][美]Robert Sedgewich,[美]Kevin Wayne著;谢路云译.算法第4版[M].北京人民邮电出版社2012.10.p344-348.
http://www.dnsts.com.cn/news/29186.html

相关文章:

  • 那些网站是vue做的做响应式网站图片需要做几版
  • phpcms v9 实现网站搜索wordpress适用于任何网站吗
  • 婚礼纪网站怎么做请帖简历模板可编辑
  • 公司建网站怎么建合肥专业做网站公司有哪些
  • 济南 营销型网站建设找谁做网站比较好
  • 怎么自己做网站凑钱兰州搜索引擎推广
  • 宝路华手表官方网站抖音seo系统
  • 网站查询访问域名重庆建筑人才网招聘
  • 怎么做自己的刷赞网站企业的网站建设与设计论文
  • 远程管理wordpress站群网页美工设计培训班
  • 网站课程建设申报书wordpress 4.9 优化
  • 网站建设公司现在还挣钱吗西安编程培训机构
  • wdcp 网站备份自发购卡网站在吗做
  • wordpress 文章 来源seo还能赚钱吗
  • 网站开发与运维收费明细网络推广沈阳
  • 网站建设培训中心网站开发的流程是怎样的
  • 本地唐山网站建设广州网站建设信科公司
  • 有哪些网站可以做家教百度联盟注册
  • 怎样做淘宝的导购网站如何制作简单的网站
  • 枫叶的网站建设博客求网页设计与网站建设
  • 做户外的网站丁香花在线视频观看免费
  • 做背景网站网站代码图片
  • 网站搭建徐州百度网络大连权威发布网站
  • 网站的ftp管理权限是什么意思厦门景观绿环建设行业协会网站
  • 竞价网站做招商加盟可以不备案吗h5网站建设的具体内容
  • 网站制作费网站空间站
  • 廊坊网站制作网页wordpress 仪表板主题
  • 南京网站优化推广东莞网站建设选择菲凡网络
  • weex做网站外贸网店
  • 哪个网站可以做创意短视频网站网站制作九江