백엔드 개발 C++ C++에서 Kruskal 알고리즘을 사용하는 방법

C++에서 Kruskal 알고리즘을 사용하는 방법

Sep 19, 2023 pm 04:10 PM
kruskal 알고리즘 적용 C++ 구현

C++에서 Kruskal 알고리즘을 사용하는 방법

C++에서 Kruskal 알고리즘을 사용하는 방법

Kruskal 알고리즘은 최소 스패닝 트리 문제를 해결하기 위해 일반적으로 사용되는 그리디 알고리즘입니다. C++ 프로그래밍에서는 간단한 코드 예제를 통해 크루스칼의 알고리즘을 이해하고 사용할 수 있습니다.

Kruskal 알고리즘의 기본 아이디어는 모든 정점이 스패닝 트리에 포함될 때까지 루프를 형성하지 않는 가장 작은 가장자리 가중치를 갖는 가장자리를 연속적으로 선택하는 것입니다. 아래에서는 C++를 사용하여 Kruskal 알고리즘을 구현하는 방법을 단계별로 소개합니다.

1단계: 데이터 준비
먼저 문제를 표현하기 위한 그래프 데이터 구조를 준비해야 합니다. C++에서는 인접 행렬이나 인접 목록을 사용하여 그래프를 표현할 수 있습니다. 여기서는 무방향 그래프를 표현하기 위해 인접 목록을 사용하기로 선택했습니다.

인접 목록은 벡터와 연결 목록의 조합을 사용하여 구현할 수 있습니다. 그래프의 꼭지점과 가장자리를 나타내는 두 가지 구조를 정의합니다.

// 图的顶点结构体
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;
    // ...
};
로그인 후 복사

2단계: Kruskal 알고리즘 구현
그래프의 데이터 구조를 준비한 후 Kruskal 알고리즘 구현을 시작할 수 있습니다. 먼저, 그래프의 가장자리를 가중치가 작은 것부터 큰 것 순으로 정렬해야 합니다. 그런 다음 Union-Find를 사용하여 선택한 가장자리가 순환을 형성할지 여부를 결정합니다. 마지막으로 선택한 가장자리를 최소 스패닝 트리에 추가합니다.

다음은 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;
}
로그인 후 복사

3단계: 테스트 코드
테스트 함수 작성, 그래프 생성 및 Kruskal 알고리즘 호출, 최소 스패닝 트리 출력:

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;
}
로그인 후 복사

위는 구현입니다. C++를 사용한 Kruskal 알고리즘의 간단한 예입니다. 이 예제를 통해 Kruskal의 알고리즘을 더 잘 이해하고 사용하여 최소 스패닝 트리 문제를 해결할 수 있습니다.

위 내용은 C++에서 Kruskal 알고리즘을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C++에서 Kruskal 알고리즘을 사용하는 방법 C++에서 Kruskal 알고리즘을 사용하는 방법 Sep 19, 2023 pm 04:10 PM

C++에서 Kruskal 알고리즘을 사용하는 방법 Kruskal 알고리즘은 최소 스패닝 트리 문제를 해결하기 위해 일반적으로 사용되는 그리디 알고리즘입니다. C++ 프로그래밍에서는 간단한 코드 예제를 통해 크루스칼의 알고리즘을 이해하고 사용할 수 있습니다. 크루스칼 알고리즘의 기본 아이디어는 간선 가중치가 가장 작은 간선을 연속적으로 선택하고 모든 정점이 스패닝 트리에 포함될 때까지 루프를 형성하지 않는 것입니다. 아래에서는 C++를 사용하여 Kruskal 알고리즘을 구현하는 방법을 단계별로 소개합니다. 1단계: 먼저 데이터 준비, I

PHP에서의 고속 검색 알고리즘 및 응용 PHP에서의 고속 검색 알고리즘 및 응용 Jun 22, 2023 pm 05:31 PM

널리 사용되는 서버 측 프로그래밍 언어인 PHP는 웹 애플리케이션 개발에 없어서는 안 될 역할을 합니다. 실제 개발에서는 대용량 데이터에 대한 조회, 검색 등의 작업을 수행해야 하는 경우가 많습니다. 이때 고속 검색 알고리즘은 매우 중요한 방향이 되었습니다. 이 기사에서는 PHP와 해당 응용 프로그램에서 일반적으로 사용되는 고속 검색 알고리즘을 소개합니다. 1. 개요 데이터 구조에서 검색이란 데이터 수집에서 지정된 조건으로 데이터 레코드를 찾는 것을 의미하며, 일반적인 검색 방법으로는 선형 검색, 이진 검색, 해시 검색 등이 있습니다. 선형 검색

Prim과 Kruskal의 최소 스패닝 트리 알고리즘이 유향 그래프에서 실패하는 이유는 무엇입니까? Prim과 Kruskal의 최소 스패닝 트리 알고리즘이 유향 그래프에서 실패하는 이유는 무엇입니까? Sep 02, 2023 pm 05:29 PM

Prim의 방법과 Kruskal의 알고리즘은 무방향 그래프에서 MST(최소 신장 트리)를 찾는 두 가지 일반적인 방법입니다. 그러나 이러한 기술은 유향 그래프에 대해 올바른 MST를 생성할 수 없습니다. 이는 유방향 그래프가 Prim과 Kruskal의 알고리즘에서 사용하는 기본 가정 및 방법에 맞지 않기 때문입니다. Prim의 알고리즘 먼저 모든 정점이 포함될 때까지 욕심 많은 방식으로 확장 최소 스패닝 트리에 가장자리를 추가하는 Prim의 알고리즘이 있습니다. MST 내부의 정점은 가중치가 가장 낮은 가장자리를 통해 MST 외부의 정점과 연결됩니다. 무방향 그래프의 모든 간선은 어느 방향으로든 이동할 수 있으므로 MST에서 외부 정점까지의 최단 경로를 쉽게 찾을 수 있습니다. 그러나 방향 그래프에서는 변이 항상 한 방향을 가리키며 직선이 아닐 수도 있습니다.

C++를 사용하여 임베디드 시스템의 예약된 작업 기능을 구현하는 방법 C++를 사용하여 임베디드 시스템의 예약된 작업 기능을 구현하는 방법 Aug 27, 2023 pm 12:05 PM

C++를 사용하여 임베디드 시스템의 예약된 작업 기능을 구현하는 방법 임베디드 시스템은 종종 예약된 작업 기능, 즉 특정 시간 간격 내에 일부 작업을 실행해야 합니다. 강력한 프로그래밍 언어인 C++는 이러한 기능을 달성하기 위한 많은 도구와 라이브러리를 제공합니다. 이 기사에서는 C++ 프로그래밍 언어를 사용하여 임베디드 시스템에서 예약된 작업 기능을 구현하는 방법을 소개하고 몇 가지 코드 예제를 제공합니다. 타이머 인터럽트 사용 임베디드 시스템에서는 타이머 인터럽트를 사용하여 예약된 작업 기능을 구현할 수 있습니다. 타이머를 설정해서

C++로 자율 주행 및 지능형 교통 시스템을 구현하는 방법은 무엇입니까? C++로 자율 주행 및 지능형 교통 시스템을 구현하는 방법은 무엇입니까? Aug 26, 2023 am 08:58 AM

C++로 자율 주행 및 지능형 교통 시스템을 구현하는 방법은 무엇입니까? 현재 인공지능 분야에서는 자율주행과 지능형 교통시스템이 화두이며, 그 적용 분야는 교통, 안전보호, 도시계획 등 다방면에 걸쳐 있다. 이 기사에서는 C++ 프로그래밍 언어를 사용하여 자율 주행 및 지능형 교통 시스템을 구현하는 방법을 살펴보고 관련 코드 예제를 제공합니다. 자율주행 및 지능형 교통시스템의 기본 원리를 이해합니다. 자율주행 시스템은 컴퓨터, 센서 및 기타 장비를 사용하여 차량을 자율적으로 탐색하고 운전하는 기술을 말합니다. 실시간으로 인식해야 합니다.

C++를 사용하여 실시간 기능을 갖춘 임베디드 시스템을 구현하는 방법 C++를 사용하여 실시간 기능을 갖춘 임베디드 시스템을 구현하는 방법 Aug 25, 2023 pm 03:18 PM

C++를 사용하여 실시간 기능을 갖춘 임베디드 시스템을 구현하는 방법 소개: 지속적인 기술 발전으로 임베디드 시스템은 다양한 분야에서 널리 사용되고 있습니다. 실시간 기능은 임베디드 시스템, 특히 외부 이벤트에 즉각적인 응답이 필요한 시나리오에서 중요한 기능입니다. 이 기사에서는 C++ 언어를 사용하여 실시간 기능이 포함된 임베디드 시스템을 구현하는 방법을 소개하고 코드 예제를 제공합니다. 실시간 운영 체제(RTOS) 실시간 운영 체제(RTOS)는 실시간 기능을 달성하는 데 핵심입니다. RTOS에는 작업 스케줄링 기능이 있습니다.

Kruskal의 최소 스패닝 트리 알고리즘 - C++의 탐욕 알고리즘 Kruskal의 최소 스패닝 트리 알고리즘 - C++의 탐욕 알고리즘 Aug 28, 2023 pm 03:05 PM

스패닝 트리(Spanning Tree)는 모든 정점을 연결하는 방향성 무방향 그래프의 하위 그래프입니다. 그래프에는 스패닝 트리가 많이 있을 수 있습니다. 각 그래프의 최소 스패닝 트리(MST)는 다른 모든 스패닝 트리와 동일하거나 작은 가중치를 갖습니다. 스패닝 트리의 가장자리에 가중치가 할당되고 그 합은 각 가장자리에 할당된 가중치입니다. V는 그래프의 정점 개수이므로 최소 스패닝 트리의 모서리 개수는 (V-1)입니다. 여기서 V는 모서리 개수입니다. Kruskal의 알고리즘을 사용하여 최소 스패닝 트리를 찾습니다. 모든 가장자리는 가중치를 기준으로 내림차순으로 정렬되어야 합니다. 가장 작은 면을 선택하세요. 루프가 형성되지 않으면 가장자리가 포함됩니다. 스패닝 트리에 (V-1) 에지가 생길 때까지 2단계를 수행해야 합니다. 이 경우 욕심 많은 접근 방식을 사용하라는 지시를 받습니다. 그리디 옵션은 가중치가 가장 작은 모서리를 선택하는 것입니다. 예: 이 그래프의 최소 스패닝 트리는 (9-1)=8입니다.

Java에서 Kruskal 알고리즘을 구현하는 방법 Java에서 Kruskal 알고리즘을 구현하는 방법 May 11, 2023 pm 10:19 PM

최소 스패닝 트리를 구성하기 위한 또 다른 알고리즘인 Kruskal 알고리즘을 소개합니다. 그래프 G = (V, E)를 무방향 연결 가중치 그래프, V = {1, 2,...n}로 설정하고, 최소 스패닝 트리 T를 설정합니다. = (V, TE)인 경우, 트리의 초기 상태는 n개의 노드만 있고 간선은 없는 연결되지 않은 그래프입니다. T = (V, {}) Kruskal의 알고리즘은 이러한 n개의 노드를 n개의 분리된 연결 가지로 처리합니다. 먼저 모든 가장자리를 가중치에 따라 작은 것부터 큰 것까지 정렬한 다음, T에서 선택할 가장자리의 수가 n-1보다 작으면 다음과 같이 탐욕스러운 선택을 합니다. 가장자리(i, j)를 선택합니다. 에지 세트 E에서 가장 작은 가중치를 사용하여 에지 세트 TE에 에지 (i, j)를 추가해도 사이클이 생성되지 않으면 에지 세트 TE에 에지 (i, j)를 추가합니다. 즉, 에지 (i)를 사용합니다. , j) 두 가지를 하나로 병합합니다.

See all articles