Algorithm 在具有以下性质的无向图中寻找三色三角形的分治算法?

Algorithm 在具有以下性质的无向图中寻找三色三角形的分治算法?,algorithm,computer-science,graph-theory,graph-algorithm,divide-and-conquer,Algorithm,Computer Science,Graph Theory,Graph Algorithm,Divide And Conquer,在无向图G=(V,E)中,顶点的颜色为红色、黄色或绿色。此外,存在一种将图划分为两个子集的方法,以便| V1 |=| V2 |或| V1 |=| V2 |+1,其中适用以下条件:要么V1的每个顶点连接到V2的每个顶点,要么V1的任何顶点都不连接到V2的顶点。这将递归地应用于V1和V2的所有诱导子图 通过将邻接矩阵自身相乘三次,我可以找到图中的所有三角形,并将对应于主对角线的非零项的节点递增。然后我可以看到三角形的节点是否正确着色。O(n^~2,8)!但是考虑到图的独特性质,我想用分治法找到一个解

在无向图G=(V,E)中,顶点的颜色为红色、黄色或绿色。此外,存在一种将图划分为两个子集的方法,以便| V1 |=| V2 |或| V1 |=| V2 |+1,其中适用以下条件:要么V1的每个顶点连接到V2的每个顶点,要么V1的任何顶点都不连接到V2的顶点。这将递归地应用于V1和V2的所有诱导子图

通过将邻接矩阵自身相乘三次,我可以找到图中的所有三角形,并将对应于主对角线的非零项的节点递增。然后我可以看到三角形的节点是否正确着色。O(n^~2,8)!但是考虑到图的独特性质,我想用分治法找到一个解决方案来找到彩色三角形。 这是一个具有给定属性的示例图。我需要找到粗体三角形: 蓝色框表示分区完全连接,紫色框表示分区之间没有连接

可以在
O(E*V)
中完成,而无需使用partition属性。 首先删除两个顶点上颜色相同的所有边,这可以在
O(E)
中完成。 在修改后的图
G'
中,每个三角形都是一个三色三角形。 在图形中查找三角形:

for each edge e(u,v):
    for each vertex w:
        if e(v,w) and e(u,w) in G':
            add (u,v,w) to triangle list
如果保留了邻接列表和邻接矩阵,则可以通过只检查
v
的邻接列表中的
w
,来改进内部循环的时间。 在这种情况下,复杂性为
O(E*max(deg(v))

问题陈述:

在一个顶点颜色不同(红、黄、绿)的无向图中寻找所有三角形

假设:

存在一种将图划分为两个子集的方法,以便| V1 |=| V2 |或| V1 |=| V2 |+1,其中下列条件适用:要么V1的每个顶点连接到V2的每个顶点,要么V1的任何顶点都不连接到V2的顶点。这将递归应用于V1和V2的所有诱导子图

逻辑:

我们可以递归地将图分解为两个子图,并找到在V1中的一个顶点和V2中的另外两个顶点之间形成的三角形,或者V2中的一个顶点和V1中的另外两个顶点之间形成的三角形

在每次递归调用时,我们可以将给定的图划分为V1、V2,这将满足上述属性(函数划分已经给出)当V1、V2的大小变为零或二者都等于1时,递归会中断。这个函数被称为V1和V2的递归函数。如果V1和V2之间没有边,则我们不必考虑这个分区作为最后的三角形列表;所以我们从这个调用返回。 现在,对于V2中的每个顶点,我们为三种颜色组合添加一个全局声明的颜色映射。使用此映射,对于V2中的每个顶点,我们检查相应的其他颜色组合,并将其添加到三角形列表中

伪实现

//设g为给定的图。
//Vertex是表示每个顶点的类(将具有“顶点数”+“颜色”属性)
//设Edge为表示边的类(将具有对应于两条边的属性“a”和“b”)
//设(v1,v2)=划分(g)是可以将图划分为v1,v2的给定函数。
//设Adjacence_list为包含给定顶点的邻接列表的ArrayList
//主被叫方方法
HashMap edge_list=新HashMap()
ArrayList邻接列表=新ArrayList()
edge_list.put('rg',new ArrayList())
edge_list.put('gy',new ArrayList())
edge\u list.put('yr',new ArrayList())
ArrayList triangle_list=新的ArrayList()
GetColumedTriangles(g)
//彩色三角形法的递归实现
获得彩色三角形(g):
(v1,v2)=分区(g)
//如果大小为零或两者的大小均为1,则无法形成三角形
如果v1.size()==0 | | v2.size()==0 | |(v1.size()==1&&v2.size()==1):
返回
//递归调用v1和v2
GetColumedTriangles(v1)
getColouredTriangles(v2)
//如果两个子图之间没有边,则返回,因为v1和v2之间现在不可能有三角形。
如果不是边(v1.get(0),v2.get(0)):
返回
//在v1中调用一个顶点,在v2中调用两个顶点
GetTriangelsIntwoGraphs(v1、v2)
//在v2中调用一个顶点,在v1中调用两个顶点
GetTriangelsIntwoGraphs(v2,v1)
//方法获取两个图之间的三角形,其中一个顶点在v1中,另两个顶点在v2中。
GetTriangelsIntwoGraphs(v1,v2):
//具有颜色到边缘映射的表单边缘列表
对于v2中的v:
对于邻接列表中的顶点,获取(v):
如果v2中的顶点:
字符串颜色=v.color+顶点颜色
如果(edge_list.get(color)==null):
颜色=顶点颜色+v颜色
边列表.颜色.放置(颜色,顶点.边)
//对于v1中的每个v,检查边缘列表中的其他彩色边缘
对于v1中的v:
ArrayList边=新的ArrayList()
如果v.color==r:
边缘=边缘列表。获取(“gy”)
否则,如果v.color==g:
边缘=边缘列表。获取(“yr”)
其他:
边缘=边缘列表。获取(“rg”)
对于边中的边:
ArrayList顶点=新建ArrayList()
顶点。添加(v)
顶点.添加(边.a)
顶点.添加(边.b)
三角形列表。添加(顶点)
结果:


全局变量三角形列表包含带有彩色三角形的顶点组。

问题到底是什么?要在无向图中用分治法找到一个3色三角形。为了更好地理解,我添加了一张图片。是的,我看到了。谢谢!节点的颜色和分区之间有联系吗?此外,原始图和子图的分区是否容易获得?如果分区需要以相当大的开销进行动态计算,则很难开发
//let g be the given graph.
//Vertex be the class representing each vertex ( will have attributes 'vertex_number' + 'colour')
//let Edge be the class representing edges ( will have attributes 'a' and 'b' corresponding to two edges
//let (v1,v2) = partition(g) be the given function which can partition the graph into V1, v2.
//let adjacency_list be the ArrayList<ArrayList<Vertex>> containing the Adjacency list for the given vertices


//Main Callee Method
HashMap<String, List<Edge>> edge_list = new HashMap<String, List<Edge>>()
ArrayList<ArrayList<Vertex>> adjacency_list = new ArrayList<ArrayList<Vertex>>()
edge_list.put('rg', new ArrayList<Edge>())
edge_list.put('gy', new ArrayList<Edge>())
edge_list.put('yr', new ArrayList<Edge>())
ArrayList<new ArrayList<Vertex>> triangle_list = new ArrayList<new ArrayList<Vertex>>()
getColouredTriangles(g)


//Recursive Implementation of Coloured Triangle method
getColouredTriangles(g):
    (v1,v2) = partition(g)
    //If size is zero or both have size as 1 no triangles can be formed
    if v1.size() == 0 || v2.size() == 0 || (v1.size() == 1 && v2.size() == 1):
        return

    //Calling recursively for both v1 and v2
    getColouredTriangles(v1)
    getColouredTriangles(v2)

    //If there is no edge between the two subgraphs, return as no triangle is possible now between v1 and v2.
    if not edge(v1.get(0), v2.get(0)):
        return
    //call for one vertex in v1, two in v2
    getTrianglesInTwoGraphs(v1,v2)
    //call for one vertex in v2, two in v1
    getTrianglesInTwoGraphs(v2,v1)

//Method to get triangles between two graphs with one vertex in v1 and other two in v2.
getTrianglesInTwoGraphs(v1,v2):
    //Form edge_list having colour to Edge mapping
    for v in v2:
        for vertex in adjacency_list.get(v):
            if vertex in v2:
                String colour = v.colour + vertex.colour
                if(edge_list.get(colour) == null):
                    colour = vertex.colour + v.colour
                edge_list.colour.put(colour,vertex.edge)

    //for each v in v1, check other coloured edges from edge_list
    for v in v1:
        ArrayList<Edge> edges = new ArrayList<Edge>()
        if v.colour == r:
            edges = edge_list.get("gy")
        else if v.colour == g:
            edges = edge_list.get("yr")
        else:
            edges = edge_list.get("rg")
        for edge in edges:
            ArrayList<Vertex> vertices = new ArrayList<Vertex>()
            vertices.add(v)
            vertices.add(edge.a)
            vertices.add(edge.b)
            triangle_list.add(vertices)