백엔드 개발 C#.Net 튜토리얼 C#에서 최단 경로 알고리즘을 구현하는 방법

C#에서 최단 경로 알고리즘을 구현하는 방법

Sep 19, 2023 am 11:34 AM
구현 방법 최단 경로 알고리즘 C#프로그래밍

C#에서 최단 경로 알고리즘을 구현하는 방법

C#에서 최단 경로 알고리즘을 구현하는 방법은 구체적인 코드 예제가 필요합니다

최단 경로 알고리즘은 그래프 이론에서 중요한 알고리즘으로, 그래프에서 두 정점 사이의 최단 경로를 찾는 데 사용됩니다. 이 기사에서는 C# 언어를 사용하여 Dijkstra 알고리즘과 Bellman-Ford 알고리즘이라는 두 가지 고전적인 최단 경로 알고리즘을 구현하는 방법을 소개합니다.

Dijkstra의 알고리즘은 널리 사용되는 단일 소스 최단 경로 알고리즘입니다. 기본 아이디어는 시작 정점에서 시작하여 점차적으로 다른 노드로 확장하고 발견된 노드의 최단 경로를 업데이트하는 것입니다. 아래는 Dijkstra의 알고리즘을 사용하여 최단 경로를 해결하는 샘플 코드입니다.

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 알고리즘은 음의 가중치 그래프를 사용하여 최단 경로 문제를 해결하기 위한 알고리즘입니다. 정점의 최단 경로를 점진적으로 업데이트하기 위해 동적 프로그래밍 아이디어를 사용합니다. 다음은 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# 언어를 사용하여 Dijkstra 알고리즘과 Bellman-Ford 알고리즘을 구현한 샘플 코드입니다. 이 두 가지 알고리즘을 사용하면 그래프의 최단 경로 문제를 해결할 수 있습니다.

위 내용은 C#에서 최단 경로 알고리즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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 Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

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#에서 그리디 알고리즘을 구현하는 방법 Sep 19, 2023 am 11:48 AM

C#에서 그리디 알고리즘을 구현하는 방법 그리디 알고리즘(Greedy Algorithm)은 일반적으로 사용되는 문제 해결 방법으로 전역 최적 솔루션을 얻기 위해 매번 현재 최적 솔루션을 선택합니다. 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 이미지 필터 효과를 구현하려면 특정 코드 예제가 필요합니다. 소개: 웹 개발 과정에서 이미지 필터 효과는 이미지의 생생함과 시각적 효과를 향상시키는 데 자주 사용됩니다. PHP 언어는 다양한 그림 필터 효과를 얻기 위한 일련의 함수와 방법을 제공합니다. 이 기사에서는 일반적으로 사용되는 그림 필터 효과와 그 구현 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 밝기 조정 밝기 조정은 사진의 밝기와 어둠을 변경할 수 있는 일반적인 사진 필터 효과입니다. PHP에서는 imagefilte를 사용하여

C#을 사용하여 클러스터 분석 알고리즘을 작성하는 방법 C#을 사용하여 클러스터 분석 알고리즘을 작성하는 방법 Sep 19, 2023 pm 02:40 PM

C#을 이용한 군집 분석 알고리즘 작성 방법 1. 개요 군집 분석은 유사한 데이터 포인트를 군집으로 그룹화하여 서로 다른 데이터 포인트를 분리하는 데이터 분석 방법입니다. 기계 학습 및 데이터 마이닝 분야에서 클러스터 분석은 일반적으로 분류기를 구축하고, 데이터 구조를 탐색하고, 숨겨진 패턴을 찾아내는 데 사용됩니다. 이 기사에서는 C#을 사용하여 클러스터 분석 알고리즘을 작성하는 방법을 소개합니다. K-평균 알고리즘을 예제 알고리즘으로 사용하고 구체적인 코드 예제를 제공하겠습니다. 2. K-평균 알고리즘 소개 K-평균 알고리즘은 가장 일반적으로 사용되는 알고리즘입니다.

See all articles