Jadual Kandungan
Kaedah penggunaan
Algoritma Tamak
Algoritma
Contoh
Output
Floyd−Algoritma Warshall dengan kos penyongsangan tepi
Kesimpulan
Rumah pembangunan bahagian belakang C++ Menyemak sama ada laluan antara dua nod dalam graf yang diberikan mewakili laluan terpendek

Menyemak sama ada laluan antara dua nod dalam graf yang diberikan mewakili laluan terpendek

Sep 07, 2023 pm 06:57 PM
nod laluan gambar

Menyemak sama ada laluan antara dua nod dalam graf yang diberikan mewakili laluan terpendek

Untuk menyemak sama ada laluan yang diberikan antara dua pusat graf mematuhi laluan terpendek, anda boleh membandingkan keseluruhan berat tepi sepanjang laluan yang diberikan dengan jarak terpendek antara gabungan pusat yang sama menggunakan laluan laluan terpendek yang boleh dipercayai. , seperti pengiraan Dijkstra atau pengiraan Floyd−Warshall. Jika semua pemberat tepi pada laluan tertentu sepadan dengan pemadaman paling terhad, maka ia mewakili laluan paling mudah. Juga: Jika berat tepi keseluruhan lebih menonjol daripada jarak terpendek, ini menunjukkan bahawa terdapat jarak pendek antara dua pusat dalam graf.

Kaedah penggunaan

  • Algoritma Dijkstra

  • Floyd−Algoritma Warshall dengan kos penyongsangan tepi

Algoritma Tamak

Pengiraan Dijkstra mungkin merupakan pengiraan traversal graf yang popular digunakan untuk mencari laluan paling terhad antara pusat sumber dan semua pusat lain dalam graf. Dalam hal menyemak sama ada laluan yang diberikan antara dua pusat berkaitan dengan laluan paling terhingga, pengiraan Dijkstra boleh digunakan untuk mengira pemisahan paling terhingga antara pusat-pusat ini. Dengan menjalankan pengiraan Dijkstra dari hab permulaan, kami mendapat selang terhingga untuk semua hab lain. Jika laluan tertentu sepadan dengan jarak paling terhad antara dua hab, maka ia mewakili laluan yang besar dan terpendek. Lain-lain: Jika laluan yang diberikan lebih panjang daripada jarak terpendek yang dikira, ini menunjukkan bahawa terdapat laluan yang lebih pendek dalam carta.

Algoritma

  • Buat laluan terpendek (graf, sumber, destinasi):

  • Mulakan satu set "lalu" untuk menyimpan jarak ke tengah, dan mulakan selang rujukan perkataan untuk menyimpan jarak yang paling terhad.

  • Tetapkan jarak hab sumber kepada infiniti dan semua jarak hab lain kepada infiniti dalam kamus pemisah.

  • Walaupun terdapat nod yang tidak dilawati,

  • a. Pusat dengan jarak terkecil dari rujukan perkataan pemisah dipilih dan ditanda sebagai dilawati.

  • b. Untuk setiap hab jiran nod semasa:

  • Kira selang sementara dengan menambah berat tepi pada jarak nod semasa.

  • Jika jarak keadaan kurang daripada jarak penyimpanan, maka jarak pemeriksaan.

  • Kembalikan benar jika jarak terpendek dari sumber ke destinasi dalam pemisahan memecah walaupun dengan panjang laluan yang diberikan (laluan yang diberikan mewakili laluan terpendek). Jika tidak, pulangkan palsu.

  • Pengiraan ini menggunakan kaedah Dijkstra untuk mengira selang terpendek dan kemudian membandingkan jarak terpendek dari sumber ke destinasi dengan panjang laluan tertentu untuk menentukan sama ada ia adalah laluan terpendek.

Contoh

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

const int INF = numeric_limits<int>::max();

bool shortestPath(vector<vector<pair<int, int>>>& graph, int source, int destination, int pathLength) {
    int numNodes = graph.size();
    vector<int> distances(numNodes, INF);
    distances[source] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.emplace(0, source);

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

        if (dist > distances[u])
            continue;

        for (auto& neighbor : graph[u]) {
            int v = neighbor.first;
            int weight = neighbor.second;

            if (dist + weight < distances[v]) {
                distances[v] = dist + weight;
                pq.emplace(distances[v], v);
            }
        }
    }

    return (distances[destination] == pathLength);
}

int main() {
    int numNodes = 6;
    vector<vector<pair<int, int>>> graph(numNodes);

    // Build the graph
    graph[0].emplace_back(1, 2);
    graph[0].emplace_back(2, 5);
    graph[1].emplace_back(3, 4);
    graph[1].emplace_back(4, 1);
    graph[2].emplace_back(3, 2);
    graph[3].emplace_back(4, 3);
    graph[3].emplace_back(5, 6);
    graph[4].emplace_back(5, 2);

    int source = 0;
    int destination = 5;
    int pathLength = 8;

    bool isShortestPath = shortestPath(graph, source, destination, pathLength);

    if (isShortestPath)
        cout << "The given path represents a shortest path." << endl;
    else
        cout << "The given path does not represent a shortest path." << endl;

    return 0;
}

Salin selepas log masuk

Output

The given path does not represent a shortest path.
Salin selepas log masuk

Floyd−Algoritma Warshall dengan kos penyongsangan tepi

Pengiraan Floyd-Warshall ialah pengiraan yang diprogramkan secara dinamik yang mencari laluan terpendek antara semua pasangan pusat dalam graf. Dalam hal menyemak sama ada laluan tertentu antara dua pusat berkaitan dengan laluan paling terhad, pengiraan Floyd-Warshall boleh digunakan untuk mengira pemisahan terpendek antara semua set pusat dalam graf. Dengan membandingkan jarak terpendek yang dikira dengan semua pemberat tepi pada laluan tertentu, kita boleh menentukan sama ada laluan tertentu melibatkan laluan paling terhingga. Jika pemberat tepi keseluruhan sepadan dengan pemisahan terpendek, maka laluan yang diberikan mungkin merupakan laluan paling terhad antara dua pusat dalam graf.

Algoritma

  • Buat kekisi 2D mengukur numNodes x numNodes dan mulakannya kepada infiniti (INF) untuk semua set nod.

  • Tetapkan penambahan sudut ke penjuru dist kepada 0.

  • Untuk setiap tepi penyelarasan (u, v) dengan berat w dalam graf, ubah suai sepenuhnya dist[u][v] kepada w dan dist[v][u] kepada w w_reversal, dengan w_reversal ialah pembalikan Diperolehi dengan cara tepi (v, u).

  • Lakukan pengiraan Floyd−Warshall selepas gelung tin:

  • Untuk setiap hab separuh jalan dari numNodes hingga 1, lakukan perkara berikut:

  • Untuk setiap agregat hab i dan j daripada numNodes kepada 1, tingkatkan dist[i][j] kepada minimum:

  • Jarak[i][j]

  • Jarak[i][k]Jarak[k][j]

  • Selepas pengiraan selesai, dist akan mengandungi pemisahan paling terhad antara semua kumpulan hab, dengan mengambil kira kos penyongsangan tepi.

  • Untuk menyemak sama ada laluan yang diberikan antara dua hab (sumber dan destinasi) ialah laluan terpendek, bandingkan panjang laluan yang diberikan dengan jarak [sumber][destinasi]. Jika ya, cara yang diberikan adalah cara yang paling terhad.

Contoh

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

const int INF = 1e9;

void floydWarshall(vector<vector<int>>& graph, int numNodes) {
    vector<vector<int>> dist(graph); // Distance matrix initialized with the graph

    for (int k = 0; k < numNodes; k++) {
        for (int i = 0; i < numNodes; i++) {
            for (int j = 0; j < numNodes; j++) {
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
            }
        }
    }

    // Printing the shortest distances
    cout << "Shortest distances between all pairs of nodes:" << endl;
    for (int i = 0; i < numNodes; i++) {
        for (int j = 0; j < numNodes; j++) {
            if (dist[i][j] == INF)
                cout << "INF ";
            else
                cout << dist[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    int numNodes = 4; // Number of nodes

    // Adjacency matrix representation of the graph with edge weights and edge reversal costs
    vector<vector<int>> graph = {
        {0, 5, INF, 10},
        {INF, 0, 3, INF},
        {INF, INF, 0, 1},
        {INF, INF, INF, 0}
    };

    floydWarshall(graph, numNodes);

    return 0;
}
Salin selepas log masuk

Output

Shortest distances between all pairs of nodes:
0 5 8 9 
INF 0 3 4 
INF INF 0 1 
INF INF INF 0 
Salin selepas log masuk

Kesimpulan

Artikel ini meneroka cara menyemak sama ada laluan tertentu antara dua pusat graf mewakili laluan paling terhingga. Ia menggambarkan dua kaedah: pengiraan Dijkstra dan pengiraan Floyd-Warshall untuk mendapatkan penyongsangan tepi. Penggunaan kod dalam C menggambarkan pengiraan ini. Ia juga menerangkan secara ringkas pengiraan dan kegunaannya. Artikel ini bertujuan untuk membantu pembaca memahami cara mencari kaedah yang paling terhad dalam graf dan menentukan sama ada kaedah yang diberikan sudah pasti yang paling mudah.

Atas ialah kandungan terperinci Menyemak sama ada laluan antara dua nod dalam graf yang diberikan mewakili laluan terpendek. 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)

Di manakah tema terletak dalam Windows 11? Di manakah tema terletak dalam Windows 11? Aug 01, 2023 am 09:29 AM

Windows 11 mempunyai begitu banyak pilihan penyesuaian, termasuk pelbagai tema dan kertas dinding. Walaupun tema ini adalah estetik dengan cara mereka sendiri, sesetengah pengguna masih tertanya-tanya di mana mereka berada di latar belakang pada Windows 11. Panduan ini akan menunjukkan kepada anda cara berbeza untuk mengakses lokasi tema Windows 11 anda. Apakah tema lalai Windows 11? Latar belakang tema lalai Windows 11 ialah bunga biru diraja abstrak yang mekar dengan latar belakang biru langit. Latar belakang ini adalah salah satu yang paling popular, terima kasih kepada jangkaan sebelum keluaran sistem pengendalian. Walau bagaimanapun, sistem pengendalian juga dilengkapi dengan pelbagai latar belakang lain. Oleh itu, anda boleh menukar latar belakang tema desktop Windows 11 pada bila-bila masa. Tema disimpan dalam Windo

Cara membetulkan ralat: Kelas utama tidak ditemui atau dimuatkan dalam Java Cara membetulkan ralat: Kelas utama tidak ditemui atau dimuatkan dalam Java Oct 26, 2023 pm 11:17 PM

Video ini tidak boleh dimainkan kerana ralat teknikal. (Kod Ralat: 102006) Panduan ini menyediakan pembetulan mudah untuk masalah biasa ini dan meneruskan perjalanan pengekodan anda. Kami juga akan membincangkan punca ralat Java dan cara mencegahnya pada masa hadapan. Apakah "Ralat: Kelas utama tidak dijumpai atau dimuatkan" dalam Java? Java ialah bahasa pengaturcaraan yang berkuasa yang membolehkan pembangun mencipta pelbagai aplikasi. Walau bagaimanapun, fleksibiliti dan kecekapannya datang dengan pelbagai kesilapan biasa yang boleh berlaku semasa pembangunan. Salah satu gangguan ialah Ralat: User_jvm_args.txt kelas utama tidak ditemui atau dimuatkan, yang berlaku apabila Mesin Maya Java (JVM) tidak dapat mencari kelas utama untuk melaksanakan program. Ralat ini bertindak sebagai penghalang jalan walaupun dalam

Penggunaan garis miring dan garis miring belakang yang berbeza dalam laluan fail Penggunaan garis miring dan garis miring belakang yang berbeza dalam laluan fail Feb 26, 2024 pm 04:36 PM

Laluan fail ialah rentetan yang digunakan oleh sistem pengendalian untuk mengenal pasti dan mencari fail atau folder. Dalam laluan fail, terdapat dua simbol biasa yang memisahkan laluan, iaitu garis miring ke hadapan (/) dan garis miring ke belakang (). Kedua-dua simbol ini mempunyai kegunaan dan makna yang berbeza dalam sistem pengendalian yang berbeza. Garis miring ke hadapan (/) ialah pemisah laluan yang biasa digunakan dalam sistem Unix dan Linux. Pada sistem ini, laluan fail bermula dari direktori akar (/) dan dipisahkan oleh garis miring ke hadapan antara setiap direktori. Sebagai contoh, laluan /home/user/Docume

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

Apakah perbezaan dalam laluan 'Komputer Saya' dalam Win11? Cara cepat untuk mencarinya! Apakah perbezaan dalam laluan 'Komputer Saya' dalam Win11? Cara cepat untuk mencarinya! Mar 29, 2024 pm 12:33 PM

Apakah perbezaan dalam laluan "Komputer Saya" dalam Win11? Cara cepat untuk mencarinya! Memandangkan sistem Windows sentiasa dikemas kini, sistem Windows 11 terkini turut membawakan beberapa perubahan dan fungsi baharu. Salah satu masalah biasa ialah pengguna tidak dapat mencari laluan ke "Komputer Saya" dalam sistem Win11 Ini biasanya merupakan operasi mudah dalam sistem Windows sebelumnya. Artikel ini akan memperkenalkan cara laluan "Komputer Saya" berbeza dalam sistem Win11, dan cara mencarinya dengan cepat. Dalam Windows1

Dalam JavaFX, apakah elemen laluan yang berbeza? Dalam JavaFX, apakah elemen laluan yang berbeza? Aug 28, 2023 pm 12:53 PM

Pakej javafx.scene.shape menyediakan beberapa kelas dengan mana anda boleh melukis pelbagai bentuk 2D, tetapi ini hanyalah bentuk primitif seperti garisan, bulatan, poligon dan elips dll... Jadi jika anda ingin melukis kompleks Untuk bentuk tersuai, anda perlu untuk menggunakan kelas Path. Kelas laluan Kelas laluan Anda boleh melukis laluan tersuai menggunakan garis besar geometri ini yang mewakili bentuk. Untuk melukis laluan tersuai, JavaFX menyediakan pelbagai elemen laluan, kesemuanya tersedia sebagai kelas dalam pakej javafx.scene.shape. LineTo - Kelas ini mewakili baris elemen laluan. Ia membantu anda melukis garis lurus dari koordinat semasa ke koordinat (baru) yang ditentukan. HlineTo - Ini adalah jadual

Bagaimana untuk mencari laluan penyimpanan fail RPM dalam sistem Linux? Bagaimana untuk mencari laluan penyimpanan fail RPM dalam sistem Linux? Mar 14, 2024 pm 04:42 PM

Dalam sistem Linux, RPM (RedHatPackageManager) ialah alat pengurusan pakej perisian biasa yang digunakan untuk memasang, menaik taraf dan memadam pakej perisian. Kadangkala kita perlu mencari laluan storan fail RPM yang dipasang untuk carian atau operasi lain. Berikut akan memperkenalkan cara mencari laluan storan fail RPM dalam sistem Linux, dan memberikan contoh kod khusus. Pertama, kita boleh menggunakan arahan rpm untuk mencari pakej RPM yang dipasang dan laluan storannya. Buka

Cara menggunakan modul os.path untuk mendapatkan pelbagai bahagian laluan fail dalam Python 3.x Cara menggunakan modul os.path untuk mendapatkan pelbagai bahagian laluan fail dalam Python 3.x Jul 30, 2023 pm 02:57 PM

Cara menggunakan modul os.path dalam Python3.x untuk mendapatkan pelbagai bahagian laluan fail Dalam pengaturcaraan Python harian, kita selalunya perlu beroperasi pada laluan fail, seperti mendapatkan nama fail, direktori fail, sambungan, dsb. daripada laluan itu. Dalam Python, anda boleh menggunakan modul os.path untuk melaksanakan operasi ini. Artikel ini akan memperkenalkan cara menggunakan modul os.path untuk mendapatkan pelbagai bahagian laluan fail untuk manipulasi fail yang lebih baik. Modul os.path menyediakan satu siri

See all articles