ZJO 1015 渔网

    技术2024-12-13  47

    说打渔村子里要靠计算机识别渔网上的破洞…………这个先汗一下

    然后输入一堆点和边的数据,要判断这个渔网是不是破的太厉害。要是大于3的一个孔就算是破洞。

     

    题目在这里

     

    这是一个图里面看有多大的最小回路的问题,貌似有些基本的图算法应该可以解决的。

    可惜算法都忘记了,自己想了一个。还没放去Judge,测试一下是对的。

     

    思路就是把单独的角切掉,那么问题就缩小了,然后再切一次,又缩小了,直到不能再切为止。如下图:

     

    本来是1,一次切完就成了3,发现3里面已经没有封闭的可以再切的角了。那么发现有一个长度4的回路,所以算一个破洞。

    如果3里也有一个边的化,就会被切到只剩下两条边,那就算是个好的渔网。

     

    python的程序如下:

     

    class fishnet: Info=[] Edge=[] class angle: node=None branch=[] def PrintFishNet(fishnet): print fishnet.Info print fishnet.Edge def PrintAngles(angle): print "node is : "+str(angle.node) print "brach are : " print angle.branch def DeleteAngles(AngleList): for angle in AngleList: net.Info[0][0]=net.Info[0][0]-1#delete one angle node net.Info[0][1]=net.Info[0][1]-2#delete two branches for index in range(len(net.Edge)-1,-1,-1): if angle.branch[0]==net.Edge[index] or angle.branch[1]==net.Edge[index]: net.Edge.remove(net.Edge[index]) def FindRelatedEdges(i,Edge): relate=[] for edge in Edge: if edge[0]==i or edge[1]==i: relate.append(edge) return relate def JudgeAngleClosed(relatedEdges,i,Edge): edge0=set(relatedEdges[0]) edge1=set(relatedEdges[1]) tempMerge=edge0|edge1 tempMerge.discard(i) templist=list(tempMerge) if list(Edge).__contains__(templist): return 1 templist.reverse() if list(Edge).__contains__(templist): return 1 return 0; def FindAngleNode(Edge,NodeCount): AngleList=[] for i in range(1,NodeCount+1): relatedEdges=FindRelatedEdges(i,Edge) if len(relatedEdges)==2: if JudgeAngleClosed(relatedEdges,i,Edge)==1: Angle=angle() Angle.node=i Angle.branch=relatedEdges AngleList.append(Angle) return AngleList def JudegFishNet(): # PrintFishNet(net) NodeCount=net.Info[0][0] EdgeCount=net.Info[0][1] Edge=net.Edge AngleList=FindAngleNode(Edge,NodeCount) if len(AngleList)>0: DeleteAngles(AngleList) JudegFishNet() else: if NodeCount>2: print 'Imperfect' else: print 'Perfect' netEdge=[]; netInfo=[]; netInfo.append([6,8]) netEdge.append([1,2]) netEdge.append([2,3]) netEdge.append([3,4]) netEdge.append([4,5]) netEdge.append([5,6]) netEdge.append([6,1]) netEdge.append([1,3]) netEdge.append([4,6]) #netEdge.append([4,1]) net=fishnet() net.Info=netInfo net.Edge=netEdge JudegFishNet()

     

    然后我在想的问题是,这样要切到最后才能知道是不是破了,能不能找到一个长度大于3的回路,并且证明它中间不可能有玄了呢?

    那样的化就不用做到最后才直到结果了…………再想想。。。。

    最新回复(0)