Comment utiliser la méthode diviser pour mieux régner pour résoudre le problème du spanning tree minimum en PHP et obtenir la solution optimale ?
L'arbre couvrant minimum est un problème classique de la théorie des graphes, qui vise à trouver un sous-ensemble de tous les sommets d'un graphe connecté et à relier les arêtes de sorte que le sous-ensemble forme un arbre et que la somme des poids de toutes les arêtes soit la le plus petit. La méthode diviser pour régner est une idée consistant à décomposer un gros problème en plusieurs sous-problèmes, puis à résoudre les sous-problèmes un par un et enfin à fusionner les résultats. L'utilisation de la méthode diviser pour régner pour résoudre le problème de l'arbre couvrant minimum en PHP peut être réalisée en suivant les étapes suivantes.
Tout d'abord, nous devons définir la structure des données du graphique. Les graphiques peuvent être représentés à l'aide de tableaux et de tableaux bidimensionnels, où les tableaux représentent des sommets et les tableaux bidimensionnels représentent des arêtes. D'autres attributs tels que des poids peuvent être ajoutés en fonction des besoins réels.
class Graph { public $vertices; public $edges; public function __construct($vertices) { $this->vertices = $vertices; $this->edges = array(); } public function addEdge($u, $v, $weight) { $this->edges[] = array("u" => $u, "v" => $v, "weight" => $weight); } }
Ensuite, nous devons implémenter l'algorithme diviser pour régner pour résoudre l'arbre couvrant minimum. Les étapes spécifiques sont les suivantes :
Ce qui suit est un exemple de code pour résoudre le problème de l'arbre couvrant minimum en utilisant la méthode diviser pour régner :
function minSpanningTree($graph) { // 基准情况:图只有一个顶点 if ($graph->vertices == 1) { return array(); } // 选择两个子图 $subgraph1 = new Graph($graph->vertices / 2); $subgraph2 = new Graph($graph->vertices - $graph->vertices / 2); // 将边分配给子图 foreach ($graph->edges as $edge) { if ($edge["v"] <= $graph->vertices / 2) { $subgraph1->addEdge($edge["u"], $edge["v"], $edge["weight"]); } else { $subgraph2->addEdge($edge["u"], $edge["v"] - $graph->vertices / 2, $edge["weight"]); } } // 递归求解子图的最小生成树 $tree1 = minSpanningTree($subgraph1); $tree2 = minSpanningTree($subgraph2); // 合并两个子图的最小生成树 $tree = array_merge($tree1, $tree2); // 返回最小生成树 return $tree; }
Enfin, nous pouvons utiliser l'algorithme ci-dessus pour résoudre l'arbre couvrant minimum problème et obtenir la solution optimale. Ce qui suit est un exemple de test simple :
// 创建一个带权重的无向图 $graph = new Graph(4); $graph->addEdge(1, 2, 1); $graph->addEdge(1, 3, 2); $graph->addEdge(2, 3, 3); $graph->addEdge(2, 4, 4); $graph->addEdge(3, 4, 5); // 求解最小生成树 $tree = minSpanningTree($graph); // 输出最小生成树的边和权重 foreach ($tree as $edge) { echo $edge["u"] . "-" . $edge["v"] . " weight: " . $edge["weight"] . " "; }
L'exécution du code ci-dessus produira les résultats suivants :
1-2 weight: 1 2-3 weight: 3 3-4 weight: 5
Comme vous pouvez le voir, en utilisant la méthode diviser pour régner pour résoudre le problème de l'arbre couvrant minimum, nous avons réussi à obtenir le minimum arbre couvrant du graphique et j'ai trouvé la solution optimale.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!