Jadual Kandungan
Tatabahasa
Algoritma
Kaedah
Kaedah 1: Kaedah mudah
Contoh
Output
Penjelasan
Kaedah 2: Gunakan baris gilir keutamaan
Kesimpulan
Rumah pembangunan bahagian belakang C++ Algoritma Boruvka dalam C++ untuk pokok rentang minimum

Algoritma Boruvka dalam C++ untuk pokok rentang minimum

Aug 27, 2023 pm 02:53 PM
c pokok rentang minimum algoritma boruvka

Algoritma Boruvka dalam C++ untuk pokok rentang minimum

Dalam teori graf, mencari pokok rentang minimum (MST) bagi graf berwajaran bersambung adalah masalah biasa. MST ialah subset tepi graf yang menghubungkan semua bucu dan meminimumkan jumlah berat tepi. Algoritma yang cekap untuk menyelesaikan masalah ini ialah algoritma Boruvka.

Tatabahasa

struct Edge {
   int src, dest, weight;
};

// Define the structure to represent a subset for union-find
struct Subset {
   int parent, rank;
};
Salin selepas log masuk

Algoritma

Sekarang, mari kita gariskan langkah-langkah yang terlibat dalam mencari pokok rentang minimum dalam algoritma Boruvka −

  • Awalkan MST ke set kosong.

  • Buat subset untuk setiap bucu, dengan setiap subset mengandungi hanya satu bucu.

  • Ulang langkah berikut sehingga pokok rentang minimum (MST) mempunyai tepi V-1 (V ialah bilangan bucu dalam graf) −

    • Untuk setiap subset, cari tepi termurah yang menyambungkannya ke subset yang lain.

    • Tambahkan tepi yang dipilih pada pokok rentang minimum.

    • Lakukan operasi kesatuan pada subset tepi yang dipilih.

  • Keluarkan pokok rentang minimum.

Kaedah

Dalam algoritma Boruvka, terdapat pelbagai cara untuk mencari kelebihan termurah yang menghubungkan setiap subset. Berikut ialah dua kaedah biasa −

Kaedah 1: Kaedah mudah

Untuk setiap subset, ulangi semua tepi dan cari tepi terkecil yang menyambungkannya ke subset yang lain.

Jejaki tepi yang dipilih dan lakukan operasi bersama.

Contoh

#include <iostream>
#include <vector>
#include <algorithm>

struct Edge {
   int src, dest, weight;
};

// Define the structure to represent a subset for union-find
struct Subset {
   int parent, rank;
};

// Function to find the subset of an element using path compression
int find(Subset subsets[], int i) {
   if (subsets[i].parent != i)
      subsets[i].parent = find(subsets, subsets[i].parent);
   return subsets[i].parent;
}

// Function to perform union of two subsets using union by rank
void unionSets(Subset subsets[], int x, int y) {
   int xroot = find(subsets, x);
   int yroot = find(subsets, y);
   if (subsets[xroot].rank < subsets[yroot].rank)
      subsets[xroot].parent = yroot;
   else if (subsets[xroot].rank > subsets[yroot].rank)
      subsets[yroot].parent = xroot;
   else {
      subsets[yroot].parent = xroot;
      subsets[xroot].rank++;
   }
}

// Function to find the minimum spanning tree using Boruvka's algorithm
void boruvkaMST(std::vector<Edge>& edges, int V) {
   std::vector<Edge> selectedEdges; // Stores the edges of the MST

   Subset* subsets = new Subset[V];
   int* cheapest = new int[V];

   // Initialize subsets and cheapest arrays
   for (int v = 0; v < V; v++) {
      subsets[v].parent = v;
      subsets[v].rank = 0;
      cheapest[v] = -1;
   }

   int numTrees = V;
   int MSTWeight = 0;

   // Keep combining components until all components are in one tree
   while (numTrees > 1) {
      for (int i = 0; i < edges.size(); i++) {
         int set1 = find(subsets, edges[i].src);
         int set2 = find(subsets, edges[i].dest);

         if (set1 != set2) {
            if (cheapest[set1] == -1 || edges[cheapest[set1]].weight > edges[i].weight)
               cheapest[set1] = i;
            if (cheapest[set2] == -1 || edges[cheapest[set2]].weight > edges[i].weight)
               cheapest[set2] = i;
         }
      }

      for (int v = 0; v < V; v++) {
         if (cheapest[v] != -1) {
            int set1 = find(subsets, edges[cheapest[v]].src);
            int set2 = find(subsets, edges[cheapest[v]].dest);

            if (set1 != set2) {
               selectedEdges.push_back(edges[cheapest[v]]);
               MSTWeight += edges[cheapest[v]].weight;
               unionSets(subsets, set1, set2);
               numTrees--;
            }

            cheapest[v] = -1;
         }
      }
   }

   // Output the MST weight and edges
   std::cout << "Minimum Spanning Tree Weight: " << MSTWeight << std::endl;
   std::cout << "Selected Edges:" << std::endl;
   for (const auto& edge : selectedEdges) {
      std::cout << edge.src << " -- " << edge.dest << " \tWeight: " << edge.weight << std::endl;
   }

   delete[] subsets;
   delete[] cheapest;
}

int main() {
   // Pre-defined input for testing purposes
   int V = 6;
   int E = 9;
   std::vector<Edge> edges = {
      {0, 1, 4},
      {0, 2, 3},
      {1, 2, 1},
      {1, 3, 2},
      {1, 4, 3},
      {2, 3, 4},
      {3, 4, 2},
      {4, 5, 1},
      {2, 5, 5}
   };

   boruvkaMST(edges, V);

   return 0;
}
Salin selepas log masuk

Output

Minimum Spanning Tree Weight: 9
Selected Edges:
0 -- 2 	Weight: 3
1 -- 2 	Weight: 1
1 -- 3 	Weight: 2
4 -- 5 	Weight: 1
3 -- 4 	Weight: 2
Salin selepas log masuk
Terjemahan bahasa Cina bagi

Penjelasan

ialah:

Penjelasan

Kami mula-mula mentakrifkan dua struktur - Tepi dan Subset. Tepi mewakili tepi dalam graf, termasuk sumber, destinasi dan berat tepi. Subset mewakili subset struktur data pertanyaan kesatuan, termasuk maklumat induk dan kedudukan.

Fungsi cari ialah fungsi pembantu yang menggunakan pemampatan laluan untuk mencari subset elemen. Ia secara rekursif mencari wakil (nod induk) subset yang mana elemen itu dimiliki dan memampatkan laluan untuk mengoptimumkan pertanyaan masa hadapan.

Fungsi

unionSets ialah satu lagi fungsi tambahan yang menggabungkan dua subset menggunakan penggabungan mengikut peringkat. Ia mencari wakil dua subset dan menggabungkannya berdasarkan pangkat untuk mengekalkan pokok yang seimbang.

Fungsi boruvkaMST mengambil sebagai input vektor tepi dan sebilangan bucu (V). Ia melaksanakan algoritma Boruvka untuk mencari MST.

Dalam fungsi boruvkaMST, kami mencipta vektor selectedEdges untuk menyimpan tepi MST.

Kami mencipta tatasusunan struktur Subset untuk mewakili subset dan memulakannya dengan nilai lalai.

Kami juga mencipta tatasusunan yang paling murah untuk menjejaki kelebihan termurah untuk setiap subset.

NumTrees pembolehubah dimulakan kepada bilangan bucu dan MSTWeight dimulakan kepada 0.

Algoritma berfungsi dengan menggabungkan komponen berulang kali sehingga semua komponen berada dalam pokok. Gelung utama berjalan sehingga numTrees menjadi 1.

Dalam setiap lelaran gelung utama, kami mengulangi semua tepi dan mencari tepi berwajaran minimum untuk setiap subset. Jika tepi menghubungkan dua subset berbeza, kami mengemas kini tatasusunan termurah dengan indeks tepi paling kurang wajaran.

Seterusnya, kami mengulangi semua subset Jika subset mempunyai kelebihan dengan berat minimum, kami menambahkannya pada vektorEdges yang dipilih, mengemas kini MSTWeight, melaksanakan operasi gabungan subset dan mengurangkan nilai numTrees.

Akhir sekali, kami mengeluarkan pemberat MST dan tepi terpilih.

Fungsi utama menggesa pengguna memasukkan bilangan bucu dan tepi. Ia kemudian mengambil input (sumber, sasaran, berat) untuk setiap tepi dan memanggil fungsi boruvkaMST dengan input.

Kaedah 2: Gunakan baris gilir keutamaan

Buat baris gilir keutamaan yang diisih mengikut berat untuk menyimpan tepi.

Untuk setiap subset, cari kelebihan berat minimum yang menyambungkannya ke subset lain daripada baris gilir keutamaan.

Jejaki tepi yang dipilih dan lakukan operasi bersama.

Contoh

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

// Edge structure representing a weighted edge in the graph
struct Edge {
   int destination;
   int weight;

   Edge(int dest, int w) : destination(dest), weight(w) {}
};

// Function to find the shortest path using Dijkstra's algorithm
vector<int> dijkstra(const vector<vector<Edge>>& graph, int source) {
   int numVertices = graph.size();
   vector<int> dist(numVertices, INT_MAX);
   vector<bool> visited(numVertices, false);

   dist[source] = 0;
   priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
   pq.push(make_pair(0, source));

   while (!pq.empty()) {
      int u = pq.top().second;
      pq.pop();

      if (visited[u]) {
         continue;
      }

      visited[u] = true;

      for (const Edge& edge : graph[u]) {
         int v = edge.destination;
         int weight = edge.weight;

         if (dist[u] + weight < dist[v]) {
            dist[v] = dist[u] + weight;
            pq.push(make_pair(dist[v], v));
         }
      }
   }

   return dist;
}

int main() {
   int numVertices = 4;
   vector<vector<Edge>> graph(numVertices);

   // Adding edges to the graph
   graph[0].push_back(Edge(1, 2));
   graph[0].push_back(Edge(2, 5));
   graph[1].push_back(Edge(2, 1));
   graph[1].push_back(Edge(3, 7));
   graph[2].push_back(Edge(3, 3));

   int source = 0;
   vector<int> shortestDistances = dijkstra(graph, source);

   cout << "Shortest distances from source vertex " << source << ":\n";
   for (int i = 0; i < numVertices; i++) {
      cout << "Vertex " << i << ": " << shortestDistances[i] << endl;
   }

   return 0;
}
Salin selepas log masuk

Output

Shortest distances from source vertex 0:
Vertex 0: 0
Vertex 1: 2
Vertex 2: 3
Vertex 3: 6
Salin selepas log masuk
Terjemahan bahasa Cina bagi

Penjelasan

ialah:

Penjelasan

Dalam pendekatan ini, kami menggunakan baris gilir keutamaan untuk mengoptimumkan proses mencari kelebihan berwajaran minimum untuk setiap subset. Di bawah ialah penjelasan terperinci tentang kod −

Struktur kod dan fungsi pembantu (seperti find dan unionSets) kekal sama seperti kaedah sebelumnya.

Fungsi

boruvkaMST diubah suai untuk menggunakan baris gilir keutamaan untuk mencari kelebihan wajaran minimum bagi setiap subset dengan cekap.

Daripada menggunakan tatasusunan termurah, kami kini mencipta baris gilir keutamaan (pq) tepi. Kami memulakannya dengan tepi graf.

Gelung utama berjalan sehingga numTrees menjadi 1, sama seperti kaedah sebelumnya.

Dalam setiap lelaran, kami mengekstrak kelebihan berat minimum (minEdge) daripada baris gilir keutamaan.

Kemudian kami menggunakan fungsi find untuk mencari subset yang menjadi milik sumber dan sasaran minEdge.

Jika subset berbeza, kami menambah minEdge pada vektorEdges yang dipilih, mengemas kini MSTWeight, melakukan gabungan subset dan mengurangkan numTrees.

Proses akan diteruskan sehingga semua komponen berada di dalam pokok.

Akhir sekali, kami mengeluarkan pemberat MST dan tepi terpilih.

Fungsi utama adalah sama seperti kaedah sebelumnya, kami telah menetapkan input untuk tujuan ujian.

Kesimpulan

Algoritma Boruvka menyediakan penyelesaian yang cekap untuk mencari pokok rentang minimum graf berwajaran. Pasukan kami meneroka dua laluan berbeza secara mendalam apabila melaksanakan algoritma dalam C++: pendekatan tradisional atau "naif". Satu lagi menggunakan baris gilir keutamaan. Bergantung pada keperluan khusus masalah yang diberikan di tangan. Setiap kaedah mempunyai kelebihan tertentu dan boleh dilaksanakan dengan sewajarnya. Dengan memahami dan melaksanakan algoritma Boruvka, anda boleh menyelesaikan masalah pokok rentang minimum dengan cekap dalam projek C++.

Atas ialah kandungan terperinci Algoritma Boruvka dalam C++ untuk pokok rentang minimum. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah pemalar dalam bahasa C Bolehkah anda berikan contoh? Apakah pemalar dalam bahasa C Bolehkah anda berikan contoh? Aug 28, 2023 pm 10:45 PM

Pemalar juga dipanggil pembolehubah dan apabila ditakrifkan, nilainya tidak berubah semasa pelaksanaan program. Oleh itu, kita boleh mengisytiharkan pembolehubah sebagai pemalar merujuk nilai tetap. Ia juga dipanggil teks. Pemalar mesti ditakrifkan menggunakan kata kunci Const. Sintaks Sintaks pemalar yang digunakan dalam bahasa pengaturcaraan C adalah seperti berikut - consttypeVariableName; ,34, 4567 Pemalar titik terapung - Contoh: 0.0, 156.89, 23.456 Pemalar perlapanan dan Perenambelasan - Contoh: Hex: 0x2a, 0xaa.. Octal

VSCode dan VS C++ IntelliSense tidak berfungsi atau mengambil perpustakaan VSCode dan VS C++ IntelliSense tidak berfungsi atau mengambil perpustakaan Feb 29, 2024 pm 01:28 PM

Kod VS dan Visual Studio C++ IntelliSense mungkin tidak dapat mengambil perpustakaan, terutamanya apabila bekerja pada projek besar. Apabila kami menuding pada #Include&lt;wx/wx.h&gt;, kami melihat mesej ralat "Tidak boleh Membuka fail sumber 'string.h'" (bergantung pada "wx/wx.h") dan kadangkala, Fungsi autolengkap tidak bertindak balas. Dalam artikel ini kita akan melihat perkara yang boleh anda lakukan jika VSCode dan VSC++ IntelliSense tidak berfungsi atau mengekstrak perpustakaan. Mengapa Intellisense saya tidak berfungsi dalam C++? Apabila bekerja dengan fail besar, kadangkala IntelliSense

Cara menggunakan algoritma Prim dalam C++ Cara menggunakan algoritma Prim dalam C++ Sep 20, 2023 pm 12:31 PM

Tajuk: Penggunaan algoritma Prim dan contoh kod dalam C++ Pengenalan: Algoritma Prim ialah algoritma pokok rentang minimum yang biasa digunakan, terutamanya digunakan untuk menyelesaikan masalah pokok rentang minimum dalam teori graf. Dalam C++, algoritma Prim boleh digunakan dengan berkesan melalui struktur data yang munasabah dan pelaksanaan algoritma. Artikel ini akan memperkenalkan cara menggunakan algoritma Prim dalam C++ dan memberikan contoh kod khusus. 1. Pengenalan kepada algoritma Prim Algoritma prim ialah algoritma tamak Ia bermula dari bucu dan secara beransur-ansur mengembangkan set bucu pokok rentang minimum sehingga ia mengandungi

Betulkan kod ralat Xbox 8C230002 Betulkan kod ralat Xbox 8C230002 Feb 27, 2024 pm 03:55 PM

Adakah anda tidak dapat membeli atau menonton kandungan pada Xbox anda kerana kod ralat 8C230002? Sesetengah pengguna terus mendapat ralat ini apabila cuba membeli atau menonton kandungan pada konsol mereka. Maaf, terdapat masalah dengan perkhidmatan Xbox. Cuba lagi nanti. Untuk bantuan dengan isu ini, lawati www.xbox.com/errorhelp. Kod Status: 8C230002 Kod ralat ini biasanya disebabkan oleh masalah pelayan atau rangkaian sementara. Walau bagaimanapun, mungkin terdapat sebab lain, seperti tetapan privasi akaun anda atau kawalan ibu bapa, yang mungkin menghalang anda daripada membeli atau melihat kandungan tertentu. Betulkan Kod Ralat Xbox 8C230002 Jika anda menerima kod ralat 8C semasa cuba menonton atau membeli kandungan pada konsol Xbox anda

Program rekursif untuk mencari elemen minimum dan maksimum tatasusunan dalam C++ Program rekursif untuk mencari elemen minimum dan maksimum tatasusunan dalam C++ Aug 31, 2023 pm 07:37 PM

Kami mengambil tatasusunan integer Arr[] sebagai input. Matlamatnya adalah untuk mencari elemen terbesar dan terkecil dalam tatasusunan menggunakan kaedah rekursif. Memandangkan kami menggunakan rekursi, kami akan mengulangi keseluruhan tatasusunan sehingga kami mencapai panjang = 1 dan kemudian mengembalikan A[0], yang membentuk huruf asas. Jika tidak, elemen semasa dibandingkan dengan nilai minimum atau maksimum semasa dan nilainya dikemas kini secara rekursif untuk elemen berikutnya. Mari kita lihat pelbagai senario input dan output untuk −Input −Arr={12,67,99,76,32}; Nilai maksimum dalam tatasusunan: 99 Penjelasan &mi

China Eastern Airlines mengumumkan bahawa pesawat penumpang C919 akan mula beroperasi tidak lama lagi China Eastern Airlines mengumumkan bahawa pesawat penumpang C919 akan mula beroperasi tidak lama lagi May 28, 2023 pm 11:43 PM

Menurut berita pada 25 Mei, China Eastern Airlines mendedahkan perkembangan terkini pesawat penumpang C919 pada mesyuarat taklimat prestasi. Menurut syarikat itu, perjanjian pembelian C919 yang ditandatangani dengan COMAC telah berkuat kuasa secara rasmi pada Mac 2021, dan pesawat C919 pertama telah dihantar menjelang akhir 2022. Dijangkakan pesawat itu akan mula beroperasi secara rasmi tidak lama lagi. China Eastern Airlines akan menggunakan Shanghai sebagai pangkalan utamanya untuk operasi komersial C919, dan merancang untuk memperkenalkan sejumlah lima pesawat penumpang C919 pada 2022 dan 2023. Syarikat itu menyatakan bahawa rancangan pengenalan masa depan akan ditentukan berdasarkan keadaan operasi sebenar dan perancangan rangkaian laluan. Menurut pemahaman editor, C919 ialah pesawat penumpang satu lorong utama generasi baharu China dengan hak harta intelek bebas sepenuhnya di dunia, dan ia mematuhi piawaian kelayakan udara yang diterima di peringkat antarabangsa. sepatutnya

Program C++ untuk mencetak corak lingkaran nombor Program C++ untuk mencetak corak lingkaran nombor Sep 05, 2023 pm 06:25 PM

Memaparkan nombor dalam format yang berbeza adalah salah satu masalah pengekodan asas pembelajaran. Konsep pengekodan yang berbeza seperti pernyataan bersyarat dan pernyataan gelung. Terdapat program yang berbeza di mana kami menggunakan aksara khas seperti asterisk untuk mencetak segi tiga atau segi empat sama. Dalam artikel ini, kami akan mencetak nombor dalam bentuk lingkaran, sama seperti petak dalam C++. Kami mengambil bilangan baris n sebagai input dan bermula dari sudut kiri atas dan bergerak ke kanan, kemudian ke bawah, kemudian ke kiri, kemudian ke atas, kemudian ke kanan lagi, dan seterusnya dan seterusnya. Corak lingkaran dengan nombor 123456724252627282982340414243309223948494431102138474645321120373635343312191817161514

Fungsi kata kunci void dalam bahasa C Fungsi kata kunci void dalam bahasa C Feb 19, 2024 pm 11:33 PM

void dalam C ialah kata kunci khas yang digunakan untuk mewakili jenis kosong, yang bermaksud data tanpa jenis tertentu. Dalam bahasa C, void biasanya digunakan dalam tiga aspek berikut. Jenis pulangan fungsi adalah tidak sah Dalam bahasa C, fungsi boleh mempunyai jenis pulangan yang berbeza, seperti int, float, char, dll. Walau bagaimanapun, jika fungsi tidak mengembalikan sebarang nilai, jenis pulangan boleh ditetapkan kepada batal. Ini bermakna bahawa selepas fungsi itu dilaksanakan, ia tidak mengembalikan nilai tertentu. Contohnya: voidhelloWorld()

See all articles