Пример #1
0
        public static void Algorithme_De_Dijkstra(int[,] graph, int source, int destination, int TailleVecteur)
        {
            int[] distance = new int[TailleVecteur];


            bool[] PlusCourtChemin = new bool[TailleVecteur];

            int b = 0;

            MeilleurRoute = new Router[TailleVecteur];



            for (int i = 0; i < TailleVecteur; ++i)
            {
                distance[i]        = int.MaxValue;
                PlusCourtChemin[i] = false;
            }


            distance[source] = 0;


            MeilleurRoute[0] = Machine.get_LesRouter()[source];

            int save        = 0;
            int CheminSuivi = 0;
            int u;

            u = Distance_Minimum(distance, PlusCourtChemin, TailleVecteur);
            PlusCourtChemin[u] = true;
            while (u != destination)
            {
                b++;


                for (int v = 0; v < TailleVecteur; ++v)
                {
                    if (!PlusCourtChemin[v] && Convert.ToBoolean(graph[u, v]) && distance[u] != int.MaxValue && distance[u] + graph[u, v] < distance[v])
                    {
                        distance[v]      = distance[u] + graph[u, v];
                        MeilleurRoute[b] = Machine.get_LesRouter()[Distance_Minimum(distance, PlusCourtChemin, TailleVecteur)];
                        save             = v;
                    }
                }
                u = Distance_Minimum(distance, PlusCourtChemin, TailleVecteur);
                PlusCourtChemin[u] = true;
                CheminSuivi       += graph[u, save];
            }
            save        = CheminSuivi;
            CheminSuivi = 0;
            b           = 0;
            for (int i = 0; i < TailleVecteur; ++i)
            {
                PlusCourtChemin[i]      = false;
                PlusCourtChemin[source] = true;
                if (Distance_Minimum(distance, PlusCourtChemin, TailleVecteur) == i)
                {
                    PlusCourtChemin[i] = true;
                }
                else
                {
                    distance[i]        = int.MaxValue;
                    PlusCourtChemin[i] = false;
                }
            }
            if (distance[destination] != save)
            {
                save = 0;
                u    = Distance_Minimum(distance, PlusCourtChemin, TailleVecteur);
                PlusCourtChemin[u] = true;
                while (CheminSuivi > distance[destination])
                {
                    b++;


                    for (int v = 0; v < TailleVecteur; ++v)
                    {
                        if (!PlusCourtChemin[v] && Convert.ToBoolean(graph[u, v]) && distance[u] != int.MaxValue && distance[u] + graph[u, v] < distance[v])
                        {
                            MeilleurRoute[b] = Machine.get_LesRouter()[Distance_Minimum(distance, PlusCourtChemin, TailleVecteur)];
                            save             = v;
                        }
                    }
                    u = Distance_Minimum(distance, PlusCourtChemin, TailleVecteur);
                    PlusCourtChemin[u] = true;
                    CheminSuivi       += graph[u, save];
                }
            }
            //Affichage(distance, TailleVecteur);
        }