ホームページ バックエンド開発 C#.Net チュートリアル C# で最短パス アルゴリズムを実装する方法

C# で最短パス アルゴリズムを実装する方法

Sep 19, 2023 am 11:34 AM
実装 最短経路アルゴリズム C#プログラミング

C# で最短パス アルゴリズムを実装する方法

C# で最短パス アルゴリズムを実装するには、特定のコード サンプルが必要です。

最短パス アルゴリズムは、グラフ理論の重要なアルゴリズムであり、グラフを解くために使用されます。 2 つの頂点間のパス。この記事では、C# 言語を使用して 2 つの古典的な最短経路アルゴリズム、ダイクストラ アルゴリズムとベルマン フォード アルゴリズムを実装する方法を紹介します。

ダイクストラのアルゴリズムは、広く使用されている単一ソースの最短パス アルゴリズムです。その基本的な考え方は、開始頂点から開始して、徐々に他のノードに拡張し、発見されたノードの最短パスを更新することです。以下は、ダイクストラのアルゴリズムを使用して最短経路を解くサンプル コードです。

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);
    }
}
ログイン後にコピー

Bellman-Ford アルゴリズムは、負の重みグラフを使用した最短経路問題を解くためのアルゴリズムです。動的プログラミングの考え方を使用して、頂点の最短経路を徐々に更新します。以下は、ベルマン フォード アルゴリズムを使用して最短パスを解決するサンプル コードです。

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);
    }
}
ログイン後にコピー

上記は、C# 言語を使用してダイクストラ アルゴリズムとベルマン フォード アルゴリズムを実装するサンプル コードです。これら 2 つのアルゴリズムを使用すると、グラフ内の最短経路問題を解決できます。

以上がC# で最短パス アルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# を使用して時系列予測アルゴリズムを作成する方法 C# を使用して時系列予測アルゴリズムを作成する方法 Sep 19, 2023 pm 02:33 PM

C# を使用した時系列予測アルゴリズムの作成方法 時系列予測とは、過去のデータを分析することで将来のデータの傾向を予測する手法です。金融、販売、天気予報など、さまざまな分野で幅広く応用されています。この記事では、C#を使用した時系列予測アルゴリズムの書き方を具体的なコード例とともに紹介します。データの準備 時系列予測を実行する前に、まずデータを準備する必要があります。一般に、時系列データは十分な長さがあり、時系列に並べられている必要があります。データベースから取得するか、

C# を使用して深層学習アルゴリズムを作成する方法 C# を使用して深層学習アルゴリズムを作成する方法 Sep 19, 2023 am 09:53 AM

C# を使用してディープ ラーニング アルゴリズムを作成する方法 はじめに: 人工知能の急速な発展に伴い、ディープ ラーニング テクノロジは多くの分野で画期的な成果を達成しました。深層学習アルゴリズムの作成と適用を実装するために、現在最も一般的に使用されている言語は Python です。ただし、C# 言語の使用を好む開発者にとっては、C# を使用して深層学習アルゴリズムを作成することも可能です。この記事では、C# を使用してディープ ラーニング アルゴリズムを作成する方法を紹介し、具体的なコード例を示します。 1. C# プロジェクトを作成します。深層学習アルゴリズムの作成を開始する前に、まず C# プロジェクトを作成する必要があります。

C# で貪欲アルゴリズムを実装する方法 C# で貪欲アルゴリズムを実装する方法 Sep 19, 2023 am 11:48 AM

C# で貪欲アルゴリズムを実装する方法 貪欲アルゴリズム (Greedy アルゴリズム) は、一般的に使用される問題解決手法であり、毎回現在の最適解を選択して、大域的な最適解を取得することを目指します。 C# では、貪欲なアルゴリズムを使用して、多くの実際的な問題を解決できます。この記事では、C# で貪欲アルゴリズムを実装する方法を紹介し、具体的なコード例を示します。 1. 貪欲アルゴリズムの基本原理 貪欲アルゴリズムの基本的な考え方は、後続のステップの影響に関係なく、毎回現在の最適解を選択することです。このような考え方

Android でポーリングを実装するにはどうすればよいですか? Android でポーリングを実装するにはどうすればよいですか? Sep 21, 2023 pm 08:33 PM

Android のポーリングは、アプリケーションがサーバーまたはデータ ソースから定期的に情報を取得および更新できるようにする重要なテクノロジです。ポーリングを実装することで、開発者はリアルタイムのデータ同期を確保し、最新のコンテンツをユーザーに提供できます。これには、サーバーまたはデータ ソースに定期的にリクエストを送信し、最新の情報を取得することが含まれます。 Android は、ポーリングを効率的に完了するためのタイマー、スレッド、バックグラウンド サービスなどの複数のメカニズムを提供します。これにより、開発者はリモート データ ソースとの同期を維持する応答性の高い動的なアプリケーションを設計できるようになります。この記事では、Android でポーリングを実装する方法について説明します。この機能の実装に関連する重要な考慮事項と手順について説明します。ポーリング 更新を定期的にチェックし、サーバーまたはソースからデータを取得するプロセスは、Android ではポーリングと呼ばれます。合格

C# を使用して幅優先検索アルゴリズムを作成する方法 C# を使用して幅優先検索アルゴリズムを作成する方法 Sep 19, 2023 am 11:45 AM

C# を使用して幅優先検索アルゴリズムを作成する方法 幅優先検索 (BFS) は、幅に従ってグラフまたはツリーを走査するために使用される、一般的に使用されるグラフ検索アルゴリズムです。この記事では、C# を使用して幅優先検索アルゴリズムを作成する方法を検討し、具体的なコード例を示します。アルゴリズムの原理 幅優先検索アルゴリズムの基本原理は、アルゴリズムの開始点から開始して、ターゲットが見つかるかグラフ全体が走査されるまで、検索範囲を層ごとに拡大することです。通常、キューを通じて実装されます。

C# を使用してハフマン符号化アルゴリズムを作成する方法 C# を使用してハフマン符号化アルゴリズムを作成する方法 Sep 21, 2023 pm 03:14 PM

C# を使用してハフマン コーディング アルゴリズムを作成する方法 はじめに: ハフマン コーディング アルゴリズムは、データ圧縮に使用される可逆アルゴリズムです。データの送信または保存中に、頻度の高い文字には短いコードを使用し、頻度の低い文字には長いコードを使用することで、データが効果的に圧縮されます。この記事では、C# を使用してハフマン コーディング アルゴリズムを作成する方法を紹介し、具体的なコード例を示します。ハフマン符号化アルゴリズムの基本原理 ハフマン符号化アルゴリズムの中心的な考え方は、ハフマン ツリーを構築することです。まず、文字の出現頻度を数えることによって、

PHPで画像フィルター効果を実装する方法 PHPで画像フィルター効果を実装する方法 Sep 13, 2023 am 11:31 AM

PHP 画像フィルター効果を実装する方法には、特定のコード例が必要です はじめに: Web 開発のプロセスでは、画像フィルター効果は、画像の鮮やかさや視覚効果を高めるためによく使用されます。 PHP 言語には、さまざまな画像フィルター効果を実現するための一連の関数とメソッドが用意されています。この記事では、一般的に使用されるいくつかの画像フィルター効果とその実装方法を紹介し、具体的なコード例を示します。 1. 明るさの調整 明るさの調整は一般的な画像フィルター効果で、画像の明暗を変更できます。 PHP で imagefilte を使用する

C# を使用してクラスター分析アルゴリズムを作成する方法 C# を使用してクラスター分析アルゴリズムを作成する方法 Sep 19, 2023 pm 02:40 PM

C# を使用したクラスター分析アルゴリズムの作成方法 1. 概要 クラスター分析は、類似したデータ点をクラスターにグループ化し、異なるデータ点を互いに分離するデータ分析手法です。機械学習とデータ マイニングの分野では、クラスター分析は、分類器を構築し、データの構造を調査し、隠れたパターンを明らかにするために一般的に使用されます。この記事では、C# を使用してクラスター分析アルゴリズムを作成する方法を紹介します。 K 平均法アルゴリズムをアルゴリズム例として使用し、具体的なコード例を示します。 2. K 平均法アルゴリズムの概要 K 平均法アルゴリズムは最も一般的に使用されます。

See all articles