Jadual Kandungan
tatabahasa
Algoritma
kaedah
Kaedah 2
Contoh 2
Output
KESIMPULAN
Rumah pembangunan bahagian belakang C++ Tanya sama ada bucu X dan Y berada dalam komponen bersambung yang sama bagi graf tidak berarah

Tanya sama ada bucu X dan Y berada dalam komponen bersambung yang sama bagi graf tidak berarah

Sep 05, 2023 pm 01:05 PM
Tanya bucu komponen yang disambungkan

Tanya sama ada bucu X dan Y berada dalam komponen bersambung yang sama bagi graf tidak berarah

Teori graf merangkumi kajian komponen bersambung, iaitu subgraf dalam graf tidak berarah di mana setiap pasangan bucu dipautkan oleh laluan dan tidak mempunyai bucu lain dengannya bersambung .

Dalam artikel ini, kita akan menyelidiki cara menggunakan bahasa pengaturcaraan C/C++ untuk menentukan sama ada dua bucu X dan Y tergolong dalam komponen bersambung yang sama dalam graf tidak berarah. Kami akan menjelaskan sintaks dan rasional kaedah sebelum menjelaskan sekurang-kurangnya dua cara berbeza untuk menyelesaikan masalah ini. Di samping itu, kami akan menyediakan contoh kod khusus dan hasil yang sepadan untuk setiap kaedah.

tatabahasa

Coretan kod yang disediakan mengisytiharkan tiga fungsi dalam C++ untuk perwakilan grafik. Fungsi isConnected mengambil dua bucu X dan Y dan mengembalikan nilai Boolean yang menunjukkan sama ada ia tergolong dalam komponen bersambung yang sama. Fungsi addEdge mengambil dua bucu X dan Y dan mewujudkan sambungan antara mereka dalam graf. Fungsi InitializeGraph mengambil nilai integer n sebagai input dan menyediakan graf dengan n bucu. Fungsi ini boleh dilaksanakan menggunakan pelbagai algoritma graf, seperti carian mendalam-dahulu atau carian luas-dahulu, untuk menyemak ketersambungan dua bucu dan mewujudkan sambungan antara bucu dalam graf.

bool isConnected(int X, int Y)
{
   // Code to check if X and Y are in the same connected component
   // Return true if X and Y are in the same connected component, false otherwise
}

void addEdge(int X, int Y)
{
   // Code to add an edge between vertices X and Y in the graph
}
void initializeGraph(int n)
{
   // Code to initialize the graph with 'n' vertices
}
Salin selepas log masuk

Algoritma

Langkah 1 - Gunakan fungsi mulakan Graf untuk memulakan graf dengan bilangan bucu yang ditentukan.

Langkah 2 - Gunakan fungsi addEdge untuk menambah tepi

antara bucu

Langkah 3 - Laksanakan kaedah traversal graf untuk melintasi setiap bucu yang berkaitan dengan bucu dan tandakannya sebagai dilawati.

Langkah 4 - Gunakan kaedah lintasan graf yang dibina untuk menentukan sama ada kedua-dua bucu X dan Y telah dilawati.

Langkah 5 - Jika kedua-dua bucu X dan Y dilawati, kembalikan benar;

kaedah

  • Kaedah 1 - Menggunakan DFS; ia ialah algoritma lintasan graf yang melawati bucu secara berulang dan menandakannya sebagai dilawati untuk mengkaji graf.

  • Kaedah 2 - Gunakan kaedah carian kesatuan, yang menggunakan struktur data untuk memantau pembahagian koleksi kepada subkumpulan yang berbeza. Ia boleh mengenal pasti bahagian bersambung graf tidak terarah dengan berkesan.

Kaedah 1

Dalam kaedah ini, ia menggunakan DFS untuk menyemak sama ada bucu X dan Y berada dalam komponen yang disambungkan yang sama, kita boleh bermula dari bucu X dan melintasi graf menggunakan DFS.

Contoh 1

Kod dinilai untuk mengesahkan sama ada dua bucu X dan Y tergolong dalam komponen bersambung yang sama dalam graf. Ia menggunakan algoritma carian pertama mendalam (DFS) untuk merentasi graf dan menentukan ketersambungan bucu. Graf diterangkan menggunakan senarai bersebelahan, di mana tepi antara bucu disimpan sebagai senarai bucu jiran setiap bucu. Kod ini memulakan tatasusunan yang dilawati untuk memantau bucu yang telah diterokai semasa traversal DFS. Laksanakan fungsi DFS pada bucu X. Jika bucu Y didapati dilawati semasa proses DFS, ini bermakna kedua-dua X dan Y adalah sebahagian daripada komponen yang disambungkan yang sama. Fungsi utama menyediakan graf dengan mencipta senarai bersebelahan dan menambah tepi padanya, dan kemudian melakukan berbilang pertanyaan untuk mengesahkan bahawa dua bucu berada dalam komponen yang disambungkan yang sama.

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

vector<int> adjList[100005];
bool visited[100005];

void dfs(int u) {
   visited[u] = true;
   for (int v : adjList[u])
      if (!visited[v])
   dfs(v);
}

bool areVerticesInSameComponentDFS(int X, int Y, int n) {
   for (int i = 1; i <= n; i++)
      visited[i] = false;
   dfs(X);
   return visited[Y];
}

int main() {
   int n = 5;
   int m = 4;
   int edges[][2] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
   for (int i = 0; i < m; i++) {
      int u = edges[i][0];
      int v = edges[i][1];
      adjList[u].push_back(v);
      adjList[v].push_back(u);
   }
   int q = 2;
   int queries[][2] = {{1, 4}, {2, 5}};
   for (int i = 0; i < q; i++) {
      int X = queries[i][0];
      int Y = queries[i][1];
      if (areVerticesInSameComponentDFS(X, Y, n))
         cout << "Vertices " << X << " and " << Y << " are in the same connected component." << endl;
      else
         cout << "Vertices " << X <<" and " << Y << " are not in the same connected component." << endl;
   }
   return 0;
}
Salin selepas log masuk

Output

Vertices 1 and 4 are in the same connected component.
Vertices 2 and 5 are in the same connected component.
Salin selepas log masuk

Kaedah 2

Dalam pendekatan ini, kita boleh mula-mula menetapkan setiap bucu kepada set bercapah untuk menggunakan kaedah dan cari untuk menentukan sama ada bucu X dan Y berada dalam komponen terpaut yang sama. Pengumpulan titik akhir tepi kemudiannya boleh digabungkan untuk setiap tepi dalam graf. Akhir sekali, kita boleh menentukan sama ada bucu X dan Y adalah ahli set yang sama, menunjukkan bahawa ia adalah komponen yang berkaitan.

Contoh 2

Kod ini melaksanakan dan mencari algoritma untuk menyemak sama ada dua bucu berada dalam komponen graf yang disambungkan yang sama. Input dikodkan keras dalam bentuk bilangan bucu n, bilangan tepi m dan tatasusunan tepi Tepi[m][2], dan nombor pertanyaan q dan tatasusunan pertanyaan Pertanyaan[q][2]. Fungsi merge(u, v) menggabungkan set yang mengandungi bucu u dengan set yang mengandungi bucu v. Fungsi areVerticesInSameComponentUnionFind(X, Y) menyemak sama ada bucu X dan Y berada dalam komponen bersambung yang sama dengan mencari nod induknya dan menyemak sama ada ia sama. Jika ia adalah sama, bucu berada dalam komponen bersambung yang sama, jika tidak, ia tidak. Hasil pertanyaan akan dicetak ke konsol.

#include <iostream>
using namespace std;
int parent[100005];
// Function to find the parent of a set using the Union-Find algorithm
int find(int u) {
    if (parent[u] == u) {
        return u;
    }
    return find(parent[u]);
}
void merge(int u, int v) {
    int parentU = find(u); // find the parent of u
    int parentV = find(v);
    if (parentU != parentV) {
        parent[parentU] = parentV;
    }
}
bool areVerticesInSameComponentUnionFind(int X, int Y) {
    int parentX = find(X); // find the parent of X
    int parentY = find(Y); // find the parent of Y
    return parentX == parentY;
}
int main() {
    int n = 5, m = 4;
    int edges[m][2] = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
    for (int i = 1; i <= n; i++) {
        parent[i] = i;
    }
    for (int i = 0; i < m; i++) {
        int u = edges[i][0], v = edges[i][1];
        merge(u, v);
    }
    int q = 3;
    int queries[q][2] = {{1, 5}, {3, 5}, {1, 4}};
    for (int i = 0; i < q; i++) {
        int X = queries[i][0], Y = queries[i][1];
        if (areVerticesInSameComponentUnionFind(X, Y)) {
            cout << "Vertices " << X << " and " << Y << " are in the same connected component." << endl;
        } else {
            cout << "Vertices " << X << " and " << Y << " are not in the same connected component." << endl;
        }
    }
    return 0;
}
Salin selepas log masuk

Output

Vertices 1 and 5 are in the same connected component.
Vertices 3 and 5 are in the same connected component.
Vertices 1 and 4 are in the same connected component.
Salin selepas log masuk

KESIMPULAN

Dalam kod ini, kami memperkenalkan dua kaedah untuk menentukan sama ada dua bucu graf tidak terarah X dan Y berkaitan antara satu sama lain. Strategi kedua menggunakan algoritma pencarian kesatuan untuk menjejaki set terputus-putus, manakala pendekatan pertama menggunakan carian mendalam-pertama (DFS) untuk merentasi graf untuk menandakan bucu yang dilawati.

Atas ialah kandungan terperinci Tanya sama ada bucu X dan Y berada dalam komponen bersambung yang sama bagi graf tidak berarah. 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)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu 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)

Gulc: Perpustakaan C dibina dari awal Gulc: Perpustakaan C dibina dari awal Mar 03, 2025 pm 05:46 PM

GULC adalah perpustakaan C berprestasi tinggi yang mengutamakan overhead yang minimum, inlining agresif, dan pengoptimuman pengkompil. Sesuai untuk aplikasi kritikal prestasi seperti perdagangan frekuensi tinggi dan sistem tertanam, reka bentuknya menekankan kesederhanaan, modul

Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Apakah jenis nilai yang dikembalikan oleh fungsi bahasa C? Apa yang menentukan nilai pulangan? Mar 03, 2025 pm 05:52 PM

Butiran artikel ini C jenis pulangan fungsi, merangkumi asas (int, float, char, dan lain -lain), diperolehi (tatasusunan, petunjuk, struktur), dan jenis kekosongan. Pengkompil menentukan jenis pulangan melalui pengisytiharan fungsi dan pernyataan pulangan, menguatkuasakan

Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Apakah definisi dan peraturan panggilan fungsi bahasa C dan apakah itu Mar 03, 2025 pm 05:53 PM

Artikel ini menerangkan perisytiharan fungsi C vs definisi, argumen lulus (dengan nilai dan penunjuk), nilai pulangan, dan perangkap umum seperti kebocoran memori dan jenis ketidakcocokan. Ia menekankan pentingnya pengisytiharan modularity dan provi

Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Langkah Format Fungsi Fungsi C Langkah Penukaran Kes Mar 03, 2025 pm 05:53 PM

Butiran artikel ini C berfungsi untuk penukaran kes rentetan. Ia menerangkan menggunakan ToUpper () dan Tolower () dari CType.H, meleleh melalui rentetan, dan mengendalikan terminator null. Perangkap biasa seperti melupakan ctype.h dan mengubahsuai literal rentetan adalah

Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Di manakah nilai pulangan fungsi bahasa C yang disimpan dalam ingatan? Mar 03, 2025 pm 05:51 PM

Artikel ini mengkaji fungsi penyimpanan nilai pulangan C. Nilai pulangan kecil biasanya disimpan dalam daftar untuk kelajuan; Nilai yang lebih besar boleh menggunakan petunjuk untuk memori (timbunan atau timbunan), memberi kesan kepada seumur hidup dan memerlukan pengurusan memori manual. Secara langsung acc

Penggunaan dan perkongsian frasa yang berbeza Penggunaan dan perkongsian frasa yang berbeza Mar 03, 2025 pm 05:51 PM

Artikel ini menganalisis kegunaan pelbagai kata sifat "berbeza," meneroka fungsi tatabahasa, frasa umum (mis., "Berbeza," "berbeza"), dan aplikasi bernuansa dalam formal vs tidak formal

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Mar 12, 2025 pm 04:50 PM

Artikel ini menerangkan Perpustakaan Templat St Standard (STL), yang memberi tumpuan kepada komponen terasnya: bekas, iterator, algoritma, dan functors. Ia memperincikan bagaimana ini berinteraksi untuk membolehkan pengaturcaraan generik, meningkatkan kecekapan kod dan kebolehbacaan t

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Mar 12, 2025 pm 04:52 PM

Artikel ini memperincikan penggunaan algoritma STL yang cekap dalam c. Ia menekankan pilihan struktur data (vektor vs senarai), analisis kerumitan algoritma (mis., Std :: Sort vs Std :: partial_sort), penggunaan iterator, dan pelaksanaan selari. Perangkap biasa seperti

See all articles