无向图:计算亏格(环的孔洞)
前一篇文章:无向图:计算亏格(环的孔洞)
首先,判断图中是否存在环。方法,找到联通子图,循环删除度为1的节点,同时删除边。直到不存在度为1的边,则联通子图只剩下环或者复杂环。
在不需要遍历出环的算法里面,可以通过欧拉公式直接计算亏格。孔洞的个数。
公式: nGenus = l-p+1; l为边的个数,p为点的个数。
过程:对于所有联通的集合,循环删除度数为1的顶点,同时删除边;计算亏格。
然而,上述过程出现了问题。主要是平面图中若严格按照直线边进行拓扑,出现了复杂图,即立体图。
如图:
改进方法:
使用多边形并差计算,以此寻找孔洞,以此来应对复杂图的特殊情况。
代码段:
import seisw.util.geom.Clip;
import seisw.util.geom.Poly;
import seisw.util.geom.PolyDefault;
// 适应情况,一个房间多个家具,只有一次孔洞,不会有岛屿!private static int findPolyGenus( List<NewPoint> walls, List<List<NewPoint>> furniturePolygons, double wallwidth,double width) {// 1.根据分区得到房间剩下的多个多边形,要求生成的多个多边形不能有空洞int genus = 0;// 默认房间为逆时针多边形,分区需保证为顺时针Poly diffPoly = new PolyDefault();for (NewPoint p : walls) {diffPoly.add(p.m_x, p.m_y);}// 确保逆时针for (int k = 0; k < furniturePolygons.size(); ++k) {List<NewPoint> f = furniturePolygons.get(k);ArrayList<NewPoint> fEx = extendPoly(furniturePolygons.get(k), 15+ width + wallwidth);//width );// furniturePolygons.set(k, fEx);Poly subPoly = new PolyDefault();for (NewPoint p : fEx) {subPoly.add(p.m_x, p.m_y);}diffPoly = (PolyDefault) Clip.difference(diffPoly, subPoly);}// 获取所有孔洞genus = diffPoly.getNumInnerPoly();for ( int i = 0; i < diffPoly.getNumInnerPoly(); ++i) {boolean isHole = diffPoly.getInnerPoly(i).isHole();if( isHole ){genus = genus - 1;}}
return genus;
最后,可以得到正确结果。
无向图:计算亏格(环的孔洞)相关推荐
- Leet Code题解 - 1559. Detect Cycles in 2D Grid 检测二维无向图中的环
Leet Code题解 -- 1559. Detect Cycles in 2D Grid 检测二维无向图中的环 前言 一.题目描述 二.思路整理 1. 审题 2. 分布实现步骤 2.1 将二维数组处 ...
- SQL计算日环比、周同比
计算日环比.周同比 范例表格如下: 这是面试问到的一个问题,回来学习之后了解可以用这个函数: 计算日活的日环比,周同比: 代码如下: select date,dau,(dau-dau_1)/dau_1 ...
- Python 判断无向图是否存在环
代码实现 def has_cycle(G):"""判断无向图是否有环:param G: example {0: [1,2],1: [3], 2: []}:return:T ...
- 应用Excel透视表计算同环比
作为一名数据分析师在日常制作报表时经常会用到同比和环比的计算,用来反映与某一阶段相比某个指标的变化程度. 同比:与历史同一时期比较,即不同年份的同一时期作比较,例如2021年4月与2020年4月相比, ...
- 【Mysql实战】使用存储过程和计算同比环比
背景 同环比,是基本的数据分析方法.在各类调研表中屡见不鲜,如果人工向前追溯统计数据,可想而知工作量是非常大的. 标题复制10行,并且每行大于10个字符[源码解析]SpringBoot接口参数[Mys ...
- python中判断无向图是否有环_数据结构与算法:17 图
17 图 知识结构: 图1 知识结构 1. 图的基本概念与术语 1.1 图的定义 图由顶点集和边集组成,记为 . 顶点集:顶点的有穷非空集合,记为. 边集:顶点偶对的有穷集合,记为 . 边: 无向边: ...
- Oracle如何根据一个日期计算同比环比的日期
iamlaosong文 在写统计查询的SQL语句时,经常会碰到根据一个查询日期推演其它日期的问题,如同比.环比等. 1.字符串转换成日期:to_date('2016-6-16', 'yyyy-mm-d ...
- java时间计算同比环比周的问题
问题描述: 在业务中会有传不同日期格式, 1.有天(2020-02-29),周(2020-03第三周),月(2020-02二月份), 2.同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2 ...
- 有向图、无向图是否有环的判断
今天在做数据库的调度冲突可串行性判别的程序,中间要用到有向图中环判定的问题,特摘录如下.这些算法和思想都是来自网上的,在此感谢原作者! 先介绍一下无向图的判断算法,这个比较简单: 判断无向图中是否存在 ...
最新文章
- 飞桨上线万能转换小工具,教你玩转TensorFlow、Caffe等模型迁移
- macos关闭软件更新小红点_MacOS和Windows哪个更适合你?
- node --- 后端使用bcrypt对密码进行加密处理
- javascript中索引_如何在JavaScript中找到数字在数组中所属的索引
- 【emWin】例程一:emWin系列教程简介
- 电脑开机一会就蓝屏怎么回事_电脑使用过程中会蓝屏,老板三分钟做系统:硬盘坏了,四百换好!...
- abaqus算出来的转角单位是什么_ABAQUS中的单位制是如何规定的
- SaaS微信小程序电商系统,一键生成小程序【源码分享】
- php 网站计数器,PHP开源程序通用网站计数器代码分享
- 分布式定时任务的解决方案
- 普通住宅和非普通住宅税费
- [踩坑记录]VS2017+大恒MER-131-210U3C相机
- 安卓模拟ibeacon_Android BLE-iBeacon系列(一)iBeacon介绍
- 六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)
- 数学定理【转自百度百科】
- iOS即时通讯,从入门到“放弃”?
- 2020-11-30 09:51:55 精确到秒的时间戳
- 通过以太坊实现自己的ICO
- NEON 常用函数讲解
- 求用户最大连续登陆天数mysql实现