• Dijkstra算法实例


    TestDijkstracpp.cpp

    #include <iostream>
    #include "Dijkstra.h"
    using namespace std;

    int main()
    {
        cout << "请输入二维数组(k*k)中k值:";
        int k;
        cin >> k;
        int**p = new int*[k];
        for(int i = 0; i < k; ++i)
        {
        p[i] = new int[k];
        }
        cout << "请输入二维数组中的元素(100表示无穷大):";
        for(int i = 0; i < k; ++i)
        {
            for(int j = 0; j < k; ++j)
            {
                cin >> p[i][j];
            }
        }

        bool* S = new bool[k];
        int* D = new int[k];
        int* Par = new int[k];
        int s = 0;

        cout << "请输入源点:";
        cin >> s;

        Dijkstra(p, s, S, D, Par, k);
        for(int d = 0; d < k; ++d)
        {
            display(s, d, D, Par, k);
        }

        system("pause");
        return 0;
    }

    Dijkstra.h

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

    #define INFINITE 100

    bool emptyBlue(bool S[], int size);
    void Dijkstra(int** p, int s, bool S[], int D[], int Par[], int size);
    int chooseBlue(bool S[], int D[], int size);
    void relax(int** p, bool S[], int D[], int Par[], int size);
    void addRed(bool S[], int n);
    int getVertex(int** p, int s, int size);
    void initializeS(bool S[], int s, int size);
    void initializePra(int Par[], int** p, int s, int size);
    void initializeD(int** p, int D[], int s, int size);
    string route(int s, int d, int Par[], int size);
    string reverse(string s);
    void display(int s, int d, int D[], int Par[], int size);

    void Dijkstra(int** p, int s, bool S[], int D[], int Par[], int size)
    {
        initializeS(S, s, size);
        initializePra(Par, p, s, size);
        initializeD(p, D, s, size);

        while(!emptyBlue(S, size))
        {
            int nextRed = getVertex(p, s, size);
            addRed(S, nextRed);
            relax(p, S, D, Par, size);
            nextRed = chooseBlue(S, D, size);
            addRed(S, nextRed);
        }
    }

    bool emptyBlue(bool S[], int size)
    {
        for(int i = 0; i < size; ++i)
        {
            if (S[i] == false)
            {
                return false;
            }
        }
        return true;
    }

    int chooseBlue(bool S[], int D[], int size)
    {
        int min = INFINITE;
        int index = 0;
        for(int i = 0; i < size; ++i)
        {
            if (S[i] == false && D[i] < min)
            {
                index = i;
                min = D[i];
            }
        }
        return index;
    }

    void relax(int** p, bool S[], int D[], int Par[], int size)
    {
        for (int i = 0; i < size; ++i)
        {
            if (S[i] == true)
            {
                for(int j = 0; j < size; ++j)
                {
                    if (S[j] == false)
                    {
                        if (D[i] + p[i][j] < D[j])
                        {
                            Par[j] = i;
                            D[j] = D[i] + p[i][j];
                        }
                    }
                }
            }
        }
    }

    void addRed(bool S[], int n)
    {
        S[n] = true;
    }

    int getVertex(int** p, int s, int size)
    {
        int min = INFINITE;
        int index = 0;
        for(int i = 0; i < size; ++i)
        {
            if (i == s)
            {
                continue;
            }
            if(p[s][i] < min)
            {
                min = p[s][i];
                index = i;
            }
        }
        return index;
    }

    void initializeS(bool S[], int s, int size)
    {
        for(int i = 0; i < size; ++i)
        {
            if (i == s)
            {
                S[i] = true;
            }
            else
            {
                S[i] = false;
            }
        }
    }

    void initializePra(int Par[], int** p, int s, int size)
    {
        for(int i = 0; i < size; ++i)
        {
            if (i == s)
            {
                Par[i] = -1;
            }
            else
            {
                if (p[s][i] < INFINITE)
                {
                    Par[i] = s;
                }
                else
                {
                    Par[i] = -1;
                }
            }
        }
    }

    void initializeD(int** p, int D[], int s, int size)
    {
        for(int i = 0; i < size; ++i)
        {
            D[i] = p[s][i];
        }
    }string route(int s, int d, int Par[], int size)

    {
        int* t = new int[size];
        for(int i = 0; i < size; ++i)
        {
            t[i] = Par[i];
        }
        string str = "";
        char* c = new char;
        if (Par[s] == t[d])
        {
            itoa(s, c, 10);
            str += c;
        }
        else
        {
            itoa(d, c, 10);
            str += c;
            while(Par[s] != t[d])
            {
                itoa(t[d], c, 10);
                str += c;
                int k = t[d];
                t[d] = Par[k];
                //str += " ";
            }
        }

        return str;

    }

    string reverse(string s)
    {
        int k = s.length();
        string s1 = "";
        for(int i = 0; i < k; ++i)
        {
             s1 += s[k - i - 1];
        }

        return s1;
    }

    void display(int s, int d, int D[], int Par[], int size)
    {
        string str = reverse(route(s, d, Par, size));

        cout << s << "---->" << d << " 最短路径为" << D[d] << " 父亲为"
        << Par[d] << " 路径为:" << str << endl;
    }

  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/720139h/p/3474640.html
Copyright © 2020-2023  润新知