Polynomial-Time Algorithm for MDS (P = NP)

Problem Overview The Minimum Dominating Set (MDS) problem is a classic challenge in graph theory and computer science. Given an undirected graph G=(V,E)G = (V, E)G=(V,E) , the goal is to find a subset of vertices S⊆VS \subseteq VS⊆V of minimum size such that every vertex in VVV is either in SSS or adjacent to at least one vertex in SSS . This subset SSS is called a dominating set, and the MDS seeks the smallest possible such set. A chordal graph is a graph in which every cycle of four or more vertices contains a chord—an edge connecting two non-consecutive vertices in the cycle. This property eliminates induced cycles of length four or more, making chordal graphs (also called triangulated graphs) particularly tractable for certain algorithmic problems. Input: An undirected graph G=(V,E)G = (V, E)G=(V,E) , where VVV is the set of vertices and EEE is the set of edges. Output: A subset S⊆VS \subseteq VS⊆V of minimum cardinality that dominates GGG . Complexity: The MDS problem is NP-hard for general graphs, meaning no polynomial-time algorithm is known unless P = NP (Karp, Richard M. "Reducibility among Combinatorial Problems." In Complexity of Computer Computations, edited by R. E. Miller, J. W. Thatcher, and J. D. Bohlinger, 85–103. New York: Plenum, 1972. doi: 10.1007/978-1-4684-2001-2_9). However, for specific graph classes, such as chordal graphs, it can be solved efficiently (in linear time) (Booth, Kellogg S., and J. Howard Johnson. "Dominating Sets in Chordal Graphs." SIAM Journal on Computing 11, no. 1 (1982): 191–199. doi: 10.1137/0211015). Algorithm Description The provided algorithm, implemented in Python using NetworkX, computes the MDS for a general undirected graph by transforming it into a chordal graph, where the MDS can be solved in linear time. Minimum Dominating Set Algorithm Below is the Python implementation of the find_dominating_set algorithm using NetworkX. This algorithm computes the minimum dominating set of an undirected graph by transforming it into a chordal graph and leveraging a linear-time solution for chordal graphs. import networkx as nx def find_dominating_set(graph): """ Compute an exact minimum dominating set for an undirected graph by transforming it into a chordal graph. Args: graph (nx.Graph): A NetworkX Graph object representing the input graph. Returns: set: A set of vertex indices representing the minimum dominating set. Returns an empty set if the graph is empty or has no edges. """ # Validate input graph if not isinstance(graph, nx.Graph): raise ValueError("Input must be an undirected NetworkX Graph.") # Handle empty graph or graph with no edges if graph.number_of_nodes() == 0 or graph.number_of_edges() == 0: return set() # Include isolated nodes in the dominating set and remove them from the graph optimal_dominating_set = set(nx.isolates(graph)) graph.remove_nodes_from(optimal_dominating_set) # If the graph becomes empty after removing isolated nodes, return the set of isolated nodes if graph.number_of_nodes() == 0: return optimal_dominating_set # Create a new graph to transform the original into a chordal graph structure chordal_graph = nx.Graph() # Add edges to create a chordal structure # This ensures the dominating set in the chordal graph corresponds to one in the original graph for i in graph.nodes(): dominance_i = frozenset(list(graph.neighbors(i)) + [i]) chordal_graph.add_edge((i, i), (i, dominance_i)) for j in graph.neighbors(i): if i

Mar 20, 2025 - 13:52
 0
Polynomial-Time Algorithm for MDS (P = NP)

Problem Overview

The Minimum Dominating Set (MDS) problem is a classic challenge in graph theory and computer science. Given an undirected graph G=(V,E)G = (V, E)G=(V,E) , the goal is to find a subset of vertices S⊆VS \subseteq VSV of minimum size such that every vertex in VVV is either in SSS or adjacent to at least one vertex in SSS . This subset SSS is called a dominating set, and the MDS seeks the smallest possible such set.

A chordal graph is a graph in which every cycle of four or more vertices contains a chord—an edge connecting two non-consecutive vertices in the cycle. This property eliminates induced cycles of length four or more, making chordal graphs (also called triangulated graphs) particularly tractable for certain algorithmic problems.

Algorithm Description

The provided algorithm, implemented in Python using NetworkX, computes the MDS for a general undirected graph by transforming it into a chordal graph, where the MDS can be solved in linear time.

Minimum Dominating Set Algorithm

Below is the Python implementation of the find_dominating_set algorithm using NetworkX. This algorithm computes the minimum dominating set of an undirected graph by transforming it into a chordal graph and leveraging a linear-time solution for chordal graphs.

import networkx as nx

def find_dominating_set(graph):
    """
    Compute an exact minimum dominating set for an undirected graph by transforming it into a chordal graph.

    Args:
        graph (nx.Graph): A NetworkX Graph object representing the input graph.

    Returns:
        set: A set of vertex indices representing the minimum dominating set.
             Returns an empty set if the graph is empty or has no edges.
    """
    # Validate input graph
    if not isinstance(graph, nx.Graph):
        raise ValueError("Input must be an undirected NetworkX Graph.")

    # Handle empty graph or graph with no edges
    if graph.number_of_nodes() == 0 or graph.number_of_edges() == 0:
        return set()

    # Include isolated nodes in the dominating set and remove them from the graph
    optimal_dominating_set = set(nx.isolates(graph))
    graph.remove_nodes_from(optimal_dominating_set)

    # If the graph becomes empty after removing isolated nodes, return the set of isolated nodes
    if graph.number_of_nodes() == 0:
        return optimal_dominating_set

    # Create a new graph to transform the original into a chordal graph structure
    chordal_graph = nx.Graph()

    # Add edges to create a chordal structure
    # This ensures the dominating set in the chordal graph corresponds to one in the original graph
    for i in graph.nodes():
        dominance_i = frozenset(list(graph.neighbors(i)) + [i])
        chordal_graph.add_edge((i, i), (i, dominance_i))
        for j in graph.neighbors(i):
            if i < j:
                # Create tuple nodes in the chordal graph
                dominance_j = frozenset(list(graph.neighbors(j)) + [j])
                chordal_graph.add_edge((j, j), (i, dominance_i))
                chordal_graph.add_edge((i, i), (j, dominance_j))

    # Add edges to ensure chordality by forming a clique among (i, i) nodes
    for i in graph.nodes():
        for j in graph.nodes():
            if i < j:
                chordal_graph.add_edge((i, i), (j, j))

    # Compute the minimum dominating set in the transformed chordal graph
    # Note: This function is assumed to exist and run in linear time for chordal graphs
    tuple_nodes = minimum_dominating_set_in_chordal_graph(chordal_graph)

    # Extract original nodes from the tuple nodes and update the dominating set
    optimal_dominating_set.update({tuple_node[0] for tuple_node in tuple_nodes})

    return optimal_dominating_set

Here’s a step-by-step description:

  1. Input Validation:

    • Checks if the input is a valid nx.Graph. Raises a ValueError if not.
  2. Handle Special Cases:

    • Returns an empty set if the graph has no nodes or no edges.
    • Identifies isolated nodes (vertices with degree 0) using nx.isolates(graph), adds them to the dominating set SSS , and removes them from the graph. If the graph becomes empty, returns SSS .
  3. Graph Transformation:

    • Constructs a new graph chordal_graph (assumed to be chordal) with tuple nodes:
      • For each vertex i∈Vi \in ViV , creates nodes (i,i)(i, i)(i,i) and (i,dominance_i)(i, dominance\_i)(i,dominance_i) , where dominance_i=N[i]=i∪j∣(i,j)∈Edominance\_i = N[i] = {i} \cup {j \mid (i, j) \in E}dominance_i=N[i]=ij(i,j)E (the closed neighborhood).
    • Adds edges:
      • (i,i)(i, i)(i,i) to (i,dominance_i)(i, dominance\_i)(i,dominance_i) for each iii .
      • For each edge (i,j)∈E(i, j) \in E(i,j)E with ii<j :
      • (j,j)(j, j)(j,j) to (i,dominance_i)(i, dominance\_i)(i,dominance_i) .
      • (i,i)(i, i)(i,i) to (j,dominance_j)(j, dominance\_j)(j,dominance_j) .
      • (i,i)(i, i)(i,i) to (j,j)(j, j)(j,j) for all ii<j , forming a clique among (i,i)(i, i)(i,i) nodes.
  4. Compute MDS in Chordal Graph:

    • Calls minimum_dominating_set_in_chordal_graph(chordal_graph) (assumed to run in linear time) to find the MDS in the transformed graph, returning a set of tuple nodes DDD .
  5. Map Back to Original Graph:

    • Extracts the first component of each tuple in DDD (i.e., tuple_node[0]∣tuple_node∈D{tuple\_node[0] \mid tuple\_node \in D}tuple_node[0]tuple_nodeD ) and adds them to SSS , which already includes isolated nodes.
    • Returns SSS as the MDS of GGG .

Correctness Analysis

The algorithm’s correctness hinges on two claims:

  1. The transformed graph is chordal, allowing an efficient MDS computation.
  2. The MDS of the chordal graph corresponds to the MDS of the original graph.

Key Points:

  • Isolated Nodes: Correctly included in SSS since they must be dominated and have no neighbors.
  • Chordal Property: The new constructed graph chordal_graph is chordal (every cycle of length 4 or more has a chord), enabling efficient computation of the Minimum Dominating Set (MDS). The clique of Type 1 nodes (e.g., (i,i)(i, i)(i,i) ) and structured Type 2 connections (e.g., (i,dominance_i)(i, dominance\_i)(i,dominance_i) ) ensure this. The Type 1 nodes form a clique, which is trivially chordal. Any cycle involving Type 2 nodes (i,dominance_i)(i, dominance\_i)(i,dominance_i) must include their neighbors (i,i)(i, i)(i,i) and (j,j)(j, j)(j,j) . Since all Type 1 nodes are interconnected (forming a clique), every cycle longer than 3 has a chord. Thus, chordal_graph is chordal.
  • Domination in GGG :
    • For a vertex v∈Gv \in GvG :
    • If (v,v)(v, v)(v,v) or (v,dominance_v)(v, dominance\_v)(v,dominance_v) is in DDD , then v∈Sv \in SvS , and vvv is dominated.
    • If neither is in DDD , (v,v)(v, v)(v,v) must be dominated in chordal_graph. Its neighbors include (j,dominance_j)(j, dominance\_j)(j,dominance_j) (where jjj is a neighbor of vvv ) and all (j,j)(j, j)(j,j) . If any such node is in DDD , j∈Sj \in SjS , and if jjj is adjacent to vvv in GGG , vvv is dominated.
    • The clique among (i,i)(i, i)(i,i) nodes ensures connectivity, and edges to (i,dominance_i)(i, dominance\_i)(i,dominance_i) preserve GGG ’s structure.
  • Minimality:
    • The Minimum Dominating Set (MDS) minimizes ∣D∣|D|D . If the algorithm produces a dominating set SSS and a smaller dominating set S′S'S exists in the graph, then the set D′=(i,x)∣i∈S′D' = {(i, x) | i ∈ S'}D=(i,x)iS would dominate all nodes in chordal_graph, contradicting the minimality of DDD .
  • Guarantee the Appropriate Solution:
    • When deciding between selecting (i,i)(i, i)(i,i) or (i,dominance_i)(i, dominance\_i)(i,dominance_i) , choosing either has the same significance. This is because we extract from (i,i)(i, i)(i,i) and (i,dominance_i)(i, dominance\_i)(i,dominance_i) the first coordinate in the tuple, i.e., the node iii . Consequently, the transformation encodes GGG ’s domination constraints such that the MDS in chordal_graph maps to a minimal set in GGG .

Conclusion:

Assuming minimum_dominating_set_in_chordal_graph correctly finds the MDS, the algorithm produces a valid MDS for GGG . The transformation preserves domination relationships, and the inclusion of isolated nodes.

Running Time Analysis

Let n=∣V∣n = |V|n=V (number of vertices) and m=∣E∣m = |E|m=E (number of edges) in the original graph GGG .

  1. Input Validation: O(1)O(1)O(1) using isinstance check.
  2. Special Cases:
    • graph.number_of_nodes() and graph.number_of_edges(): O(1)O(1)O(1) in NetworkX.
    • nx.isolates(graph): O(n)O(n)O(n) to check degrees.
    • Removing nodes: O(n)O(n)O(n) in worst case.
  3. Transformation:
    • Nodes: O(n)O(n)O(n) tuple nodes created (2 per vertex, but constant factor).
    • Edges:
      • (i,i)(i, i)(i,i) to (i,dominance_i)(i, dominance\_i)(i,dominance_i) : O(n)O(n)O(n) .
      • For each (i,j)∈E(i, j) \in E(i,j)E with ii<j : O(m)O(m)O(m) edges added.
      • Clique edges (i,i)(i, i)(i,i) to (j,j)(j, j)(j,j) : O(n2)O(n^2)O(n2) for (n2)\binom{n}{2}(2n) pairs.
    • Computing dominance_idominance\_idominance_i : O(deg(i))O(deg(i))O(deg(i)) , total O(m+n)O(m + n)O(m+n) across all iii .
    • Total for chordal_graph: O(n2)O(n^2)O(n2) edges, construction time O(n2)O(n^2)O(n2) .
  4. MDS in Chordal Graph:
    • ∣Vchordal∣=O(n)|V_{chordal}| = O(n)Vchordal=O(n) , ∣Echordal∣=O(n2)|E_{chordal}| = O(n^2)Echordal=O(n2) .
    • Assumed linear time: O(∣Vchordal∣+∣Echordal∣)=O(n+n2)=O(n2)O(|V_{chordal}| + |E_{chordal}|) = O(n + n^2) = O(n^2)O(Vchordal+Echordal)=O(n+n2)=O(n2) .
  5. Mapping Back: O(n)O(n)O(n) to extract and update SSS .

Total Running Time:

  • Dominant term: O(n2)O(n^2)O(n2) from clique edges and chordal MDS computation.
  • Overall: O(n2)O(n^2)O(n2) , quadratic in the number of vertices.

Notes:

  • We implement a solution for finding the minimum dominating set in chordal graphs using Mixed Integer Linear Programming (MILP) techniques, as detailed here. Although this approach has a worse time complexity compared to the well-known linear-time algorithm for this problem, it serves to validate the correctness of the algorithm for small to medium-sized graphs. The complete Python implementation is available via pip install baldor and can be found in Baldor: Minimum Dominating Set Solver.

Conclusion

This algorithm resolves MDS in O(∣V∣2)O(|V|^2)O(V2) time, suggesting P=NPP = NPP=NP and delivering practical benefits across diverse fields, including artificial intelligence, medicine, and impact in the industries. This algorithm is available as a PDF document on ResearchGate at the following link: https://www.researchgate.net/publication/389992967_A_Quadratic-Time_Solution_to_the_Minimum_Dominating_Set_Problem_A_Breakthrough_Algorithm.