Jadual Kandungan
Kaedah penggunaan
Kaedah rekursif naif
Algoritma
Contoh
Output
Algoritma Dijkstra dengan kekangan tepi
示例
输出
结论
Rumah pembangunan bahagian belakang C++ Dalam graf berwajaran terarah, cari laluan terpendek yang mengandungi tepat k tepi.

Dalam graf berwajaran terarah, cari laluan terpendek yang mengandungi tepat k tepi.

Sep 11, 2023 pm 07:17 PM
laluan terpendek graf terarah graf berwajaran

Dalam graf berwajaran terarah, cari laluan terpendek yang mengandungi tepat k tepi.

Dalam graf berwajaran yang diselaraskan, masalah mencari laluan terpendek dengan tepat tepi k melibatkan penentuan laluan dengan berat terkecil semasa menavigasi tepat k tepi. Ini akan dicapai dengan menggunakan strategi pengaturcaraan dinamik, seperti menggunakan rangka kerja 3D untuk menyimpan pemberat minimum dalam semua cara yang boleh difikirkan. Pengiraan diulang pada bucu dan tepi, melaraskan berat minimum pada setiap langkah. Dengan mempertimbangkan semua cara yang mungkin untuk mempunyai tepi k yang tepat, pengiraan boleh membezakan cara yang paling terhad untuk mempunyai tepi k dalam graf.

Kaedah penggunaan

  • Kaedah rekursif naif

  • Algoritma Dijkstra dengan kekangan tepi

Kaedah rekursif naif

Kaedah rekursif naif boleh menjadi strategi penting dan jelas untuk penyelesaian masalah, yang terdiri daripada menguraikan masalah kompleks kepada sub-masalah yang lebih kecil dan menyelesaikannya secara rekursif. Dalam pendekatan ini, kerja memanggil dirinya beberapa kali untuk meneroka submasalah sehingga kes asas dicapai. Walau bagaimanapun, ia boleh membazir untuk masalah yang lebih besar kerana pengiraan dua kali dan meliputi submasalah. Ia memerlukan kaedah pengoptimuman seperti memori atau pengaturcaraan tenaga. Kaedah rekursif mudah tertipu mudah diperoleh dan dilaksanakan, tetapi mungkin mengalami kerumitan masa eksponen. Ia sering digunakan untuk menyelesaikan masalah berskala kecil atau sebagai titik permulaan untuk pengiraan yang lebih optimum.

Algoritma

  • Mewakili laluan terpendek yang berfungsi (graf, u, v, k) yang mengambil sebagai input graf, bucu sumber u, bucu sasaran v dan bilangan tepi k.

  • Semak situasi asas:

  • a. Kembalikan jika k dan u pulang modal dengan v (kerana tiada tepi dibenarkan dalam kes ini).

  • Yang kedua. Jika k ialah 1 dan terdapat tepi antara u dan v dalam graf, beratnya dikembalikan.

  • c Jika k kurang daripada atau sama dengan 0, kembalikan tanpa sempadan (kerana tepi negatif atau sifar tidak dibenarkan).

  • Mulakan pembolehubah tak terhingga untuk menyimpan jarak laluan terpendek.

  • Graf harus berulang ke atas semua bucu seperti berikut:

  • a. Jika anda dan saya tidak menyamai anda atau v, maka wujud kelebihan daripada anda kepada saya:

  • Panggil shortestPath secara rekursif, dengan i ialah bucu sumber moden, v ialah bucu sasaran dan k−1 ialah bilangan tepi yang tinggal.

  • Jika hasil yang dikembalikan tidak terhingga, res dinaik taraf kepada nilai minimum res dan berat tepi semasa dan hasil rekursif.

  • Kembalikan nilai res sebagai cara paling terhad untuk mengasingkan tepi k dengan tepat.

Contoh

#include <iostream>
#include <climits>

#define V 4
#define INF INT_MAX

int shortestPathWithKEdges(int graph[][V], int source, int destination, int k) {
    // Base cases
    if (k == 0 && source == destination)
        return 0;
    if (k == 1 && graph[source][destination] != INF)
        return graph[source][destination];
    if (k <= 0)
        return INF;

    // Initialize result
    int shortestPathDistance = INF;

    // Explore all adjacent vertices of the source vertex
    for (int i = 0; i < V; i++) {
        if (graph[source][i] != INF && source != i && destination != i) {
            int recursiveDistance = shortestPathWithKEdges(graph, i, destination, k - 1);
            if (recursiveDistance != INF)
                shortestPathDistance = std::min(shortestPathDistance, graph[source][i] + recursiveDistance);
        }
    }

    return shortestPathDistance;
}

int main() {
    int graph[V][V] = {
        {0, 10, 3, 2},
        {INF, 0, INF, 7},
        {INF, INF, 0, 6},
        {INF, INF, INF, 0}
    };
    int source = 0, destination = 3, k = 2;
    std::cout << "Weight of the shortest path is " << shortestPathWithKEdges(graph, source, destination, k) << std::endl;
    return 0;
}

Salin selepas log masuk

Output

Weight of the shortest path is 9
Salin selepas log masuk

Algoritma Dijkstra dengan kekangan tepi

Algoritma Dijkstra dengan kekangan tepi ialah pengiraan traversal graf yang digunakan untuk mengenal pasti laluan terpendek antara bucu sumber dan semua bucu lain pada graf. Ia mengambil kira had atau kekangan pada tepi graf, seperti pemberat tepi yang paling atau paling sedikit. Pengiraan mengekalkan garis bucu yang diperlukan dan secara berulang memilih bucu paling sedikit untuk dialih keluar. Pada ketika ini, jika laluan yang lebih pendek ditemui, ia melonggarkan bucu bersebelahan dengan meningkatkan jarak antara mereka. Penyediaan ini berterusan sehingga semua bucu telah dilawati. Algoritma Dijkstra dengan arahan tepi menjamin bahawa cara yang dipilih memenuhi kekangan tepi yang diperlukan sambil mencari cara yang paling terhad

Algoritma

  • Gunakan parameter berikut untuk mencipta karya seni Dijkstra

  • Graf: graf input dengan bucu dan tepi

    Sumber: permulaan puncak laluan paling terhad

    Kekangan: Had atau halangan di tepi

    Mulakan satu set bucu yang hilang dan garis permintaan untuk menyimpan bucu dan jaraknya.

  • Buat gugusan pemadaman dan tetapkan pemadaman kepada penamatan untuk semua bucu kecuali bucu sumber, yang ditetapkan kepada 0.

  • Susun bucu sumber ke dalam baris yang dikehendaki dengan jaraknya.

  • Walaupun saluran paip permintaan tidak boleh dibersihkan, sila lakukan perkara berikut:

  • Turunkan bucu dengan bilangan penyingkiran paling sedikit daripada baris gilir yang diingini.

  • Jika puncak tidak lagi dilawati sekarang,

  • Tandai sebagai dilawati.

  • Untuk setiap bucu bersebelahan bucu moden:

  • Gunakan halangan tepi untuk menentukan sama ada kelebihan boleh dipertimbangkan.

  • Kira jarak yang tidak digunakan dari menyuap bucu ke bucu bersebelahan dengan mengambil kira berat tepi dan kekangan.

  • Tingkatkan tatasusunan pembatas jika pembatas semasa lebih pendek daripada pembatas moden.

  • Bariskan bucu bersebelahan dengan jarak yang tidak digunakan ke dalam baris yang dikehendaki.

  • Selepas semua bucu dicapai, kelompok berasingan akan mengandungi jarak pendek maksimum dari bucu bekalan ke setiap bucu yang memenuhi kekangan tepi.

  • Kembalikan kelompok individu sebagai hasil.

示例

#include <iostream>
#include <vector>
#include <limits>

struct Edge {
    int destination;
    int weight;
};

void dijkstra(const std::vector<std::vector<Edge>>& graph, int source, std::vector<int>& distance) {
    int numVertices = graph.size();
    std::vector<bool> visited(numVertices, false);
    distance.resize(numVertices, std::numeric_limits<int>::max());
    distance[source] = 0;

    for (int i = 0; i < numVertices - 1; ++i) {
        int minDistance = std::numeric_limits<int>::max();
        int minVertex = -1;

        for (int v = 0; v < numVertices; ++v) {
            if (!visited[v] && distance[v] < minDistance) {
                minDistance = distance[v];
                minVertex = v;
            }
        }

        if (minVertex == -1)
            break;

        visited[minVertex] = true;

        for (const auto& edge : graph[minVertex]) {
            int destination = edge.destination;
            int weight = edge.weight;

            if (!visited[destination] && distance[minVertex] != std::numeric_limits<int>::max() &&
                distance[minVertex] + weight < distance[destination]) {
                distance[destination] = distance[minVertex] + weight;
            }
        }
    }
}

int main() {
    int numVertices = 4;
    int source = 0;
    std::vector<std::vector<Edge>> graph(numVertices);

    // Add edges to the graph (destination, weight)
    graph[0] = {{1, 10}, {2, 3}};
    graph[1] = {{2, 1}, {3, 7}};
    graph[2] = {{3, 6}};

    std::vector<int> distance;
    dijkstra(graph, source, distance);

    // Print the shortest distances from the source vertex
    std::cout << "Shortest distances from vertex " << source << ":\n";
    for (int i = 0; i < numVertices; ++i) {
        std::cout << "Vertex " << i << ": " << distance[i] << '\n';
    }

    return 0;
}
Salin selepas log masuk

输出

Shortest distances from vertex 0:
Vertex 0: 0
Vertex 1: 10
Vertex 2: 3
Vertex 3: 9
Salin selepas log masuk

结论

本文概述了两个重要的计算,以帮助理解协调和加权图表中的大多数问题。它阐明了易受骗的递归方法和带有边缘限制的 Dijkstra 计算。轻信递归方法包括递归地研究具有精确 k 个边的所有可能的方式,以发现最有限的方式。 Dijkstra 的边命令式计算采用了所需的线和面积规则,成功地找出了图表中从供给顶点到所有不同顶点的最大受限方式。本文包含了计算的具体说明,并给出了测试代码来说明其用法.

Atas ialah kandungan terperinci Dalam graf berwajaran terarah, cari laluan terpendek yang mengandungi tepat k tepi.. 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.

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)

Struktur Data Bahasa C: Perwakilan Data dan Operasi Pokok dan Grafik Struktur Data Bahasa C: Perwakilan Data dan Operasi Pokok dan Grafik Apr 04, 2025 am 11:18 AM

Struktur Data Bahasa C: Perwakilan data pokok dan graf adalah struktur data hierarki yang terdiri daripada nod. Setiap nod mengandungi elemen data dan penunjuk kepada nod anaknya. Pokok binari adalah jenis pokok khas. Setiap nod mempunyai paling banyak dua nod kanak -kanak. Data mewakili structtreenode {intData; structtreenode*left; structtreenode*right;}; Operasi mewujudkan pokok traversal pokok (predecision, in-order, dan kemudian pesanan) Node Node Carian Pusat Node Node adalah koleksi struktur data, di mana unsur-unsur adalah simpul, dan mereka boleh dihubungkan bersama melalui tepi dengan data yang betul atau tidak jelas yang mewakili jiran.

Kebenaran di sebalik masalah operasi fail bahasa C Kebenaran di sebalik masalah operasi fail bahasa C Apr 04, 2025 am 11:24 AM

Kebenaran mengenai masalah operasi fail: Pembukaan fail gagal: Kebenaran yang tidak mencukupi, laluan yang salah, dan fail yang diduduki. Penulisan data gagal: Penampan penuh, fail tidak boleh ditulis, dan ruang cakera tidak mencukupi. Soalan Lazim Lain: Traversal fail perlahan, pengekodan fail teks yang salah, dan kesilapan bacaan fail binari.

Cara Mengira C-SubScript 3 Subscript 5 C-SubScript 3 Subscript 5 Algoritma Tutorial Cara Mengira C-SubScript 3 Subscript 5 C-SubScript 3 Subscript 5 Algoritma Tutorial Apr 03, 2025 pm 10:33 PM

Pengiraan C35 pada dasarnya adalah matematik gabungan, yang mewakili bilangan kombinasi yang dipilih dari 3 dari 5 elemen. Formula pengiraan ialah C53 = 5! / (3! * 2!), Yang boleh dikira secara langsung oleh gelung untuk meningkatkan kecekapan dan mengelakkan limpahan. Di samping itu, memahami sifat kombinasi dan menguasai kaedah pengiraan yang cekap adalah penting untuk menyelesaikan banyak masalah dalam bidang statistik kebarangkalian, kriptografi, reka bentuk algoritma, dll.

Apakah keperluan asas untuk fungsi bahasa C Apakah keperluan asas untuk fungsi bahasa C Apr 03, 2025 pm 10:06 PM

Fungsi bahasa C adalah asas untuk modularization kod dan bangunan program. Mereka terdiri daripada pengisytiharan (tajuk fungsi) dan definisi (badan fungsi). Bahasa C menggunakan nilai untuk lulus parameter secara lalai, tetapi pembolehubah luaran juga boleh diubahsuai menggunakan lulus alamat. Fungsi boleh mempunyai atau tidak mempunyai nilai pulangan, dan jenis nilai pulangan mestilah selaras dengan perisytiharan. Penamaan fungsi harus jelas dan mudah difahami, menggunakan nomenclature unta atau garis bawah. Ikuti prinsip tanggungjawab tunggal dan pastikan kesederhanaan fungsi untuk meningkatkan kebolehkerjaan dan kebolehbacaan.

Konsep fungsi bahasa c Konsep fungsi bahasa c Apr 03, 2025 pm 10:09 PM

F Fungsi bahasa adalah blok kod yang boleh diguna semula. Mereka menerima input, melakukan operasi, dan hasil pulangan, yang secara modular meningkatkan kebolehgunaan dan mengurangkan kerumitan. Mekanisme dalaman fungsi termasuk parameter lulus, pelaksanaan fungsi, dan nilai pulangan. Seluruh proses melibatkan pengoptimuman seperti fungsi dalam talian. Fungsi yang baik ditulis mengikut prinsip tanggungjawab tunggal, bilangan parameter kecil, penamaan spesifikasi, dan pengendalian ralat. Penunjuk yang digabungkan dengan fungsi dapat mencapai fungsi yang lebih kuat, seperti mengubahsuai nilai pembolehubah luaran. Pointer fungsi meluluskan fungsi sebagai parameter atau alamat kedai, dan digunakan untuk melaksanakan panggilan dinamik ke fungsi. Memahami ciri dan teknik fungsi adalah kunci untuk menulis program C yang cekap, boleh dipelihara, dan mudah difahami.

Definisi nama fungsi dalam bahasa c Definisi nama fungsi dalam bahasa c Apr 03, 2025 pm 10:03 PM

Definisi nama fungsi bahasa C termasuk: jenis nilai pulangan, nama fungsi, senarai parameter dan badan fungsi. Nama fungsi harus jelas, ringkas dan bersatu dalam gaya untuk mengelakkan konflik dengan kata kunci. Nama fungsi mempunyai skop dan boleh digunakan selepas pengisytiharan. Penunjuk fungsi membolehkan fungsi diluluskan atau ditugaskan sebagai hujah. Kesalahan umum termasuk konflik penamaan, ketidakcocokan jenis parameter, dan fungsi yang tidak diisytiharkan. Pengoptimuman prestasi memberi tumpuan kepada reka bentuk dan pelaksanaan fungsi, sementara kod yang jelas dan mudah dibaca adalah penting.

Fungsi Penggunaan Fungsi Jarak Jarak Jarak Penggunaan C Tutorial Penggunaan Fungsi Penggunaan Fungsi Jarak Jarak Jarak Penggunaan C Tutorial Penggunaan Apr 03, 2025 pm 10:27 PM

STD :: Unik menghilangkan elemen pendua bersebelahan di dalam bekas dan menggerakkannya ke akhir, mengembalikan iterator yang menunjuk ke elemen pendua pertama. STD :: Jarak mengira jarak antara dua iterators, iaitu bilangan elemen yang mereka maksudkan. Kedua -dua fungsi ini berguna untuk mengoptimumkan kod dan meningkatkan kecekapan, tetapi terdapat juga beberapa perangkap yang perlu diberi perhatian, seperti: STD :: Unik hanya berkaitan dengan unsur -unsur pendua yang bersebelahan. STD :: Jarak kurang cekap apabila berurusan dengan Iterator Akses Bukan Rawak. Dengan menguasai ciri -ciri dan amalan terbaik ini, anda boleh menggunakan sepenuhnya kuasa kedua -dua fungsi ini.

Apakah perbezaan dan hubungan antara C dan C#? Apakah perbezaan dan hubungan antara C dan C#? Apr 03, 2025 pm 10:36 PM

Walaupun C dan C# mempunyai persamaan, mereka sama sekali berbeza: C adalah pengurusan memori yang berorientasikan proses, dan bahasa yang bergantung kepada platform yang digunakan untuk pengaturcaraan sistem; C# adalah bahasa berorientasikan objek, sampah, dan bahasa bebas platform yang digunakan untuk desktop, aplikasi web dan pembangunan permainan.

See all articles