练手最多的也就是广搜,今天连个状态机也写不出来,弱,非常的弱,眼高手低的毛病一直没改,幸好我周围好人很多,很多。
分析一下处理这个图的同构和回环处理方法。
首先是第一种情况,两个类图,要合并的元素是一样的类或者接口。可以这样理解为一个为正本,一个为副本。方法如下:
1,把副本的目标元素,删除,正本顶替副本的位置。
2,只要副本直接关联元素和间接关联元素显示为TRUE,则直接把正本的直接和间接关联元素替换为副本的元素。不管正本那边的关联元素为true
或者为false;
3,如果副本关联元素为false,则服从于正本关联元素。
本着这个想法,先对副本做一次广搜,然后把显示为true的元素入队列,接着和正本元素映射,但凡映射上的元素执行两个步骤,替换自己的位置,替换和目标元素直接关联元素内存储的目标元素。例如目标元素A的关联元素是B,C,D,那么B,C,D里面有A,如果A替换为a,那么B,C,D里面也要替换A为a。
于是乎就有了以下代码:
CSDN居然没能控制长宽。
处理另一种情况:处理圆环情况。
和前辈讨论了一下,明白了情况,问题解决方法就浮出水面。
有一条回路,A,B,C,D,A。现在要合并两个A,另外有两个A各自带了E,F和E,F。元素都相同的。合并的时候要区分回路上的元素和非回路上的元素,一开始,讨论出,要从副本每个元素都跑一遍,也就是每个元素都深搜一遍看看是不是在一条回路上,后来想了想,从正本那边出发就不用了去考虑那么多了,因为从副本到正本只有一条路,只要获得了正本就说明和正本直接关联的那个元素N就在回路上,那么就不处理N,直接处理把副本删除,和正本的非N得直接关联元素删除,把正本元素和副本的直接关联元素黏合。黏合方法和上述一样。
加多这个处理函数
有个关键问题,一开始是以元素名字映射防止返回已经遍历过的元素,但是在回路上,是有出现双胞胎的情况,遍历过的这个元素名很可能在回路上也存在。所以改为用id单独映射。
图这块当初没好好学。现在我的心态确实很浮躁。好好地干自己的分内事。