Rumah pembangunan bahagian belakang Tutorial C#.Net Bagaimana untuk melaksanakan algoritma laluan terpendek dalam C#

Bagaimana untuk melaksanakan algoritma laluan terpendek dalam C#

Sep 19, 2023 am 11:34 AM
Kaedah pelaksanaan algoritma laluan terpendek c#programming

Bagaimana untuk melaksanakan algoritma laluan terpendek dalam C#

Bagaimana untuk melaksanakan algoritma laluan terpendek dalam C#, contoh kod khusus diperlukan

Algoritma laluan terpendek ialah algoritma penting dalam teori graf, digunakan untuk mencari laluan terpendek antara dua bucu dalam graf. Dalam artikel ini, kami akan memperkenalkan cara menggunakan bahasa C# untuk melaksanakan dua algoritma laluan terpendek klasik: algoritma Dijkstra dan algoritma Bellman-Ford.

Algoritma Dijkstra ialah algoritma laluan terpendek sumber tunggal yang digunakan secara meluas. Idea asasnya ialah bermula dari puncak permulaan, berkembang secara beransur-ansur ke nod lain, dan mengemas kini laluan terpendek bagi nod yang ditemui. Berikut ialah kod sampel yang menggunakan algoritma Dijkstra untuk menyelesaikan laluan terpendek:

using System;
using System.Collections.Generic;

public class DijkstraAlgorithm
{
    private int vertexCount;
    private int[] distance;
    private bool[] visited;
    private List<List<int>> adjacencyMatrix;

    public DijkstraAlgorithm(List<List<int>> graph)
    {
        vertexCount = graph.Count;
        distance = new int[vertexCount];
        visited = new bool[vertexCount];
        adjacencyMatrix = graph;
    }

    public void FindShortestPath(int startVertex)
    {
        // 初始化距离数组和访问数组
        for (int i = 0; i < vertexCount; i++)
        {
            distance[i] = int.MaxValue;
            visited[i] = false;
        }

        // 起始顶点到自身的距离为0
        distance[startVertex] = 0;

        for (int i = 0; i < vertexCount - 1; i++)
        {
            int u = FindMinDistance();

            // 标记u为已访问
            visited[u] = true;

            // 更新u的邻接顶点的距离
            for (int v = 0; v < vertexCount; v++)
            {
                if (!visited[v] && adjacencyMatrix[u][v] != 0 && distance[u] != int.MaxValue
                    && distance[u] + adjacencyMatrix[u][v] < distance[v])
                {
                    distance[v] = distance[u] + adjacencyMatrix[u][v];
                }
            }
        }

        // 输出最短路径
        Console.WriteLine("顶点    最短路径");
        for (int i = 0; i < vertexCount; i++)
        {
            Console.WriteLine(i + "    " + distance[i]);
        }
    }

    private int FindMinDistance()
    {
        int minDistance = int.MaxValue;
        int minDistanceIndex = -1;
        for (int i = 0; i < vertexCount; i++)
        {
            if (!visited[i] && distance[i] <= minDistance)
            {
                minDistance = distance[i];
                minDistanceIndex = i;
            }
        }
        return minDistanceIndex;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        // 构建示例图
        List<List<int>> graph = new List<List<int>>()
        {
            new List<int>() {0, 4, 0, 0, 0, 0, 0, 8, 0},
            new List<int>() {4, 0, 8, 0, 0, 0, 0, 11, 0},
            new List<int>() {0, 8, 0, 7, 0, 4, 0, 0, 2},
            new List<int>() {0, 0, 7, 0, 9, 14, 0, 0, 0},
            new List<int>() {0, 0, 0, 9, 0, 10, 0, 0, 0},
            new List<int>() {0, 0, 4, 0, 10, 0, 2, 0, 0},
            new List<int>() {0, 0, 0, 14, 0, 2, 0, 1, 6},
            new List<int>() {8, 11, 0, 0, 0, 0, 1, 0, 7},
            new List<int>() {0, 0, 2, 0, 0, 0, 6, 7, 0}
        };

        // 使用Dijkstra算法求解最短路径
        DijkstraAlgorithm dijkstraAlgorithm = new DijkstraAlgorithm(graph);
        dijkstraAlgorithm.FindShortestPath(0);
    }
}
Salin selepas log masuk

Algoritma Bellman-Ford ialah algoritma untuk menyelesaikan masalah laluan terpendek dengan graf berat negatif. Ia menggunakan idea pengaturcaraan dinamik untuk mengemas kini laluan terpendek simpang secara beransur-ansur. Berikut ialah contoh kod yang menggunakan algoritma Bellman-Ford untuk menyelesaikan laluan terpendek:

using System;
using System.Collections.Generic;

public class BellmanFordAlgorithm
{
    private int vertexCount;
    private int[] distance;
    private List<Edge> edges;

    private class Edge
    {
        public int source;
        public int destination;
        public int weight;

        public Edge(int source, int destination, int weight)
        {
            this.source = source;
            this.destination = destination;
            this.weight = weight;
        }
    }

    public BellmanFordAlgorithm(int vertexCount)
    {
        this.vertexCount = vertexCount;
        distance = new int[vertexCount];
        edges = new List<Edge>();
    }

    public void AddEdge(int source, int destination, int weight)
    {
        edges.Add(new Edge(source, destination, weight));
    }

    public void FindShortestPath(int startVertex)
    {
        // 初始化距离数组
        for (int i = 0; i < vertexCount; i++)
        {
            distance[i] = int.MaxValue;
        }

        // 起始顶点到自身的距离为0
        distance[startVertex] = 0;

        // 迭代vertexCount-1次,更新距离
        for (int i = 0; i < vertexCount - 1; i++)
        {
            foreach (Edge edge in edges)
            {
                if (distance[edge.source] != int.MaxValue && distance[edge.source] + edge.weight < distance[edge.destination])
                {
                    distance[edge.destination] = distance[edge.source] + edge.weight;
                }
            }
        }

        // 检查是否存在负权环路
        foreach (Edge edge in edges)
        {
            if (distance[edge.source] != int.MaxValue && distance[edge.source] + edge.weight < distance[edge.destination])
            {
                Console.WriteLine("图中存在负权环路");
                return;
            }
        }

        // 输出最短路径
        Console.WriteLine("顶点    最短路径");
        for (int i = 0; i < vertexCount; i++)
        {
            Console.WriteLine(i + "    " + distance[i]);
        }
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        // 构建示例图
        int vertexCount = 5;
        BellmanFordAlgorithm bellmanFordAlgorithm = new BellmanFordAlgorithm(vertexCount);
        bellmanFordAlgorithm.AddEdge(0, 1, 6);
        bellmanFordAlgorithm.AddEdge(0, 2, 7);
        bellmanFordAlgorithm.AddEdge(1, 2, 8);
        bellmanFordAlgorithm.AddEdge(1, 4, -4);
        bellmanFordAlgorithm.AddEdge(1, 3, 5);
        bellmanFordAlgorithm.AddEdge(2, 4, 9);
        bellmanFordAlgorithm.AddEdge(2, 3, -3);
        bellmanFordAlgorithm.AddEdge(3, 1, -2);
        bellmanFordAlgorithm.AddEdge(4, 3, 7);

        // 使用Bellman-Ford算法求解最短路径
        bellmanFordAlgorithm.FindShortestPath(0);
    }
}
Salin selepas log masuk

Di atas adalah contoh kod yang menggunakan bahasa C# untuk melaksanakan algoritma Dijkstra dan algoritma Bellman-Ford. Melalui kedua-dua algoritma ini, kita boleh menyelesaikan masalah laluan terpendek dalam graf.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan algoritma laluan terpendek dalam C#. 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)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 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)

Bagaimana untuk menulis algoritma ramalan siri masa menggunakan C# Bagaimana untuk menulis algoritma ramalan siri masa menggunakan C# Sep 19, 2023 pm 02:33 PM

Cara menulis algoritma peramalan siri masa menggunakan C# Peramalan siri masa ialah kaedah meramal arah aliran data masa hadapan dengan menganalisis data lepas. Ia mempunyai aplikasi yang luas dalam banyak bidang seperti kewangan, jualan dan ramalan cuaca. Dalam artikel ini, kami akan memperkenalkan cara menulis algoritma ramalan siri masa menggunakan C#, dengan contoh kod khusus. Penyediaan Data Sebelum melakukan peramalan siri masa, anda perlu menyediakan data terlebih dahulu. Secara umumnya, data siri masa hendaklah mempunyai panjang yang mencukupi dan disusun mengikut urutan kronologi. Anda boleh mendapatkannya daripada pangkalan data atau

Bagaimana untuk menulis algoritma pembelajaran mendalam menggunakan C# Bagaimana untuk menulis algoritma pembelajaran mendalam menggunakan C# Sep 19, 2023 am 09:53 AM

Cara menggunakan C# untuk menulis algoritma pembelajaran mendalam Pengenalan: Dengan perkembangan pesat kecerdasan buatan, teknologi pembelajaran mendalam telah mencapai keputusan terobosan dalam banyak bidang. Untuk melaksanakan penulisan dan aplikasi algoritma pembelajaran mendalam, bahasa yang paling biasa digunakan pada masa ini ialah Python. Walau bagaimanapun, bagi pembangun yang lebih suka menggunakan bahasa C#, ia juga boleh digunakan untuk menggunakan C# untuk menulis algoritma pembelajaran mendalam. Artikel ini akan memperkenalkan cara menulis algoritma pembelajaran mendalam menggunakan C# dan memberikan contoh kod khusus. 1. Buat projek C# Sebelum mula menulis algoritma pembelajaran mendalam, anda perlu mencipta terlebih dahulu

Bagaimana untuk melaksanakan algoritma tamak dalam C# Bagaimana untuk melaksanakan algoritma tamak dalam C# Sep 19, 2023 am 11:48 AM

Bagaimana untuk melaksanakan algoritma tamak dalam C# Algoritma tamak (Algoritma tamak) ialah kaedah penyelesaian masalah yang biasa digunakan Ia memilih penyelesaian optimum semasa setiap kali dengan harapan untuk mendapatkan penyelesaian optimum global. Dalam C#, kita boleh menggunakan algoritma tamak untuk menyelesaikan banyak masalah praktikal. Artikel ini akan memperkenalkan cara melaksanakan algoritma tamak dalam C# dan memberikan contoh kod khusus. 1. Prinsip asas algoritma tamak Idea asas algoritma tamak adalah untuk memilih penyelesaian optimum semasa setiap kali, tanpa mengira kemungkinan kesan daripada langkah-langkah berikutnya. Pemikiran begini

Bagaimana untuk menulis algoritma carian luas pertama menggunakan C# Bagaimana untuk menulis algoritma carian luas pertama menggunakan C# Sep 19, 2023 am 11:45 AM

Cara menggunakan C# untuk menulis algoritma carian pertama-luas (Breadth-First Search, BFS) ialah algoritma carian graf yang biasa digunakan untuk melintasi graf atau pokok mengikut keluasan. Dalam artikel ini, kami akan meneroka cara menulis algoritma carian luas pertama menggunakan C# dan memberikan contoh kod konkrit. Prinsip Algoritma Prinsip asas algoritma carian breadth-first adalah bermula dari titik permulaan algoritma dan mengembangkan julat carian lapisan demi lapisan sehingga sasaran ditemui atau keseluruhan graf dilalui. Ia biasanya dilaksanakan melalui baris gilir.

Apakah cara untuk melaksanakan pengundian dalam Android? Apakah cara untuk melaksanakan pengundian dalam Android? Sep 21, 2023 pm 08:33 PM

Undian dalam Android ialah teknologi utama yang membolehkan aplikasi mendapatkan dan mengemas kini maklumat daripada pelayan atau sumber data pada selang masa yang tetap. Dengan melaksanakan tinjauan pendapat, pembangun boleh memastikan penyegerakan data masa nyata dan menyediakan kandungan terkini kepada pengguna. Ia melibatkan menghantar permintaan tetap kepada pelayan atau sumber data dan mendapatkan maklumat terkini. Android menyediakan berbilang mekanisme seperti pemasa, rangkaian dan perkhidmatan latar belakang untuk menyelesaikan tinjauan pendapat dengan cekap. Ini membolehkan pembangun mereka bentuk aplikasi responsif dan dinamik yang kekal disegerakkan dengan sumber data jauh. Artikel ini meneroka cara melaksanakan tinjauan pendapat dalam Android. Ia merangkumi pertimbangan utama dan langkah yang terlibat dalam melaksanakan fungsi ini. Undian Proses menyemak secara berkala untuk kemas kini dan mendapatkan semula data daripada pelayan atau sumber dipanggil tinjauan pendapat dalam Android. lulus

Bagaimana untuk menulis algoritma pengekodan Huffman menggunakan C# Bagaimana untuk menulis algoritma pengekodan Huffman menggunakan C# Sep 21, 2023 pm 03:14 PM

Cara menulis algoritma pengekodan Huffman menggunakan C# Pengenalan: Algoritma pengekodan Huffman ialah algoritma tanpa kerugian yang digunakan untuk pemampatan data. Semasa penghantaran atau penyimpanan data, data dimampatkan dengan berkesan dengan menggunakan kod yang lebih pendek untuk aksara yang lebih kerap dan kod yang lebih panjang untuk aksara yang kurang kerap. Artikel ini akan memperkenalkan cara menggunakan C# untuk menulis algoritma pengekodan Huffman dan memberikan contoh kod khusus. Prinsip asas algoritma pengekodan Huffman Idea teras algoritma pengekodan Huffman adalah untuk membina pokok Huffman. Pertama, dengan mengira kekerapan kejadian watak, yang

Bagaimana untuk melaksanakan kesan penapis imej dalam PHP Bagaimana untuk melaksanakan kesan penapis imej dalam PHP Sep 13, 2023 am 11:31 AM

Kaedah pelaksanaan kesan penapis imej PHP memerlukan contoh kod khusus Pengenalan: Dalam proses pembangunan web, kesan penapis imej sering digunakan untuk meningkatkan kejelasan dan kesan visual imej. Bahasa PHP menyediakan satu siri fungsi dan kaedah untuk mencapai pelbagai kesan penapis gambar Artikel ini akan memperkenalkan beberapa kesan penapis gambar yang biasa digunakan dan kaedah pelaksanaannya, dan menyediakan contoh kod tertentu. 1. Pelarasan kecerahan Pelarasan kecerahan ialah kesan penapis gambar biasa, yang boleh menukar kecerahan dan kegelapan gambar. Dalam PHP dengan menggunakan imagefilte

Bagaimana untuk menulis algoritma analisis kelompok menggunakan C# Bagaimana untuk menulis algoritma analisis kelompok menggunakan C# Sep 19, 2023 pm 02:40 PM

Cara menulis algoritma analisis kelompok menggunakan C# 1. Gambaran Keseluruhan Analisis kelompok ialah kaedah analisis data yang memisahkan titik data yang tidak serupa antara satu sama lain dengan mengumpulkan titik data yang serupa ke dalam kelompok. Dalam bidang pembelajaran mesin dan perlombongan data, analisis kelompok biasanya digunakan untuk membina pengelas, meneroka struktur data dan mendedahkan corak tersembunyi. Artikel ini akan memperkenalkan cara menggunakan C# untuk menulis algoritma analisis kelompok. Kami akan menggunakan algoritma K-means sebagai contoh algoritma dan memberikan contoh kod khusus. 2. Pengenalan kepada algoritma K-means Algoritma K-means adalah yang paling biasa digunakan

See all articles