Maison > développement back-end > C++ > Comment utiliser l'algorithme de Kruskal en C++

Comment utiliser l'algorithme de Kruskal en C++

王林
Libérer: 2023-09-19 16:10:53
original
1416 Les gens l'ont consulté

Comment utiliser lalgorithme de Kruskal en C++

Comment utiliser l'algorithme de Kruskal en C++

L'algorithme de Kruskal est un algorithme glouton couramment utilisé pour résoudre le problème de l'arbre couvrant minimum. En programmation en C++, nous pouvons comprendre et utiliser l'algorithme de Kruskal à travers des exemples de code simples.

L'idée de base de l'algorithme de Kruskal est de sélectionner en continu l'arête ayant le plus petit poids d'arête et qui ne forme pas de boucle tant que tous les sommets ne sont pas inclus dans l'arbre couvrant. Ci-dessous, nous présenterons étape par étape comment utiliser C++ pour implémenter l'algorithme de Kruskal.

Étape 1 : Préparation des données
Tout d'abord, nous devons préparer une structure de données graphique pour représenter le problème. En C++, les graphiques peuvent être représentés à l'aide de matrices de contiguïté ou de listes de contiguïté. Ici, nous choisissons d'utiliser des listes de contiguïté pour représenter des graphiques non orientés.

Les listes de contiguïté peuvent être implémentées en utilisant une combinaison de vecteurs et de listes chaînées. Nous définissons deux structures pour représenter les sommets et les arêtes du graphe.

// 图的顶点结构体
struct Vertex {
    int id; // 顶点的唯一标识符
    // ...
};

// 图的边结构体
struct Edge {
    int start; // 边的起始顶点
    int end; // 边的结束顶点
    int weight; // 边的权重
    // ...
};

// 定义一个无向图的类
class Graph {
public:
    // 添加顶点和边的函数
    void addVertex(Vertex v);
    void addEdge(Edge e);
    // ...
private:
    // 保存顶点和边的数据结构
    vector<Vertex> vertices;
    list<Edge> edges;
    // ...
};
Copier après la connexion

Étape 2 : Implémenter l'algorithme Kruskal
Après avoir préparé la structure des données du graphique, nous pouvons commencer à implémenter l'algorithme Kruskal. Tout d’abord, nous devons trier les bords du graphique de petit à grand en poids. Ensuite, nous utilisons Union-Find pour déterminer si les arêtes sélectionnées formeront un cycle. Enfin, nous ajoutons les arêtes sélectionnées à l'arbre couvrant minimum.

Ce qui suit est le code d'implémentation spécifique de l'algorithme Kruskal :

// 定义并查集结构体
struct UnionFind {
    vector<int> parent;
    // ...
};

// 初始化并查集
void initUnionFind(UnionFind& uf, int n) {
    uf.parent.resize(n);
    // ...
}

// 查找根节点
int findRoot(UnionFind& uf, int x) {
    if (uf.parent[x] != x) {
        uf.parent[x] = findRoot(uf, uf.parent[x]);
    }
    return uf.parent[x];
}

// 合并两个集合
void mergeSets(UnionFind& uf, int x, int y) {
    int rootX = findRoot(uf, x);
    int rootY = findRoot(uf, y);
    if (rootX != rootY) {
        uf.parent[rootX] = rootY;
    }
}

// Kruskal算法主函数
list<Edge> kruskal(Graph& graph) {
    list<Edge> minSpanningTree;
    // 将图的边按照权重从小到大排序
    graph.edges.sort([](const Edge& e1, const Edge& e2) {
        return e1.weight < e2.weight;
    });

    int numVertices = graph.vertices.size();
    UnionFind uf;
    initUnionFind(uf, numVertices);

    for (const Edge& edge : graph.edges) {
        int startRoot = findRoot(uf, edge.start);
        int endRoot = findRoot(uf, edge.end);
        // 如果两个顶点不在同一个集合中,则添加该边到最小生成树中
        if (startRoot != endRoot) {
            minSpanningTree.push_back(edge);
            mergeSets(uf, startRoot, endRoot);
        }
    }
    
    return minSpanningTree;
}
Copier après la connexion

Étape 3 : tester le code
Écrivez une fonction de test, créez un graphique et appelez l'algorithme Kruskal, et affichez l'arbre couvrant minimum :

void testKruskal() {
    Graph graph;
    // 添加顶点和边
    // ...
    
    list<Edge> minSpanningTree = kruskal(graph);
    // 输出最小生成树
    for (const Edge& edge : minSpanningTree) {
        cout << edge.start << " -> " << edge.end << ", weight: " << edge.weight << endl;
    }
}

int main() {
    testKruskal();
    return 0;
}
Copier après la connexion

Ce qui précède est l'implémentation de l'algorithme Kruskal en utilisant C++ Un exemple simple. Grâce à cet exemple, vous pouvez mieux comprendre et utiliser l'algorithme de Kruskal pour résoudre le problème de l'arbre couvrant minimum.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal