导航

C++实现最短路径算法

#include <iostream>
#include <iomanip>
#define int_max 5000
#define max_ver 20
typedef enum { dg, dn, udg, udn } graphkind;
typedef struct arccell
{
    int adj;
    //infotype *info;
}arc, adjmat[max_ver][max_ver];
typedef struct
{
    char vexs[max_ver];
    adjmat arcs;
    int vexnum, arcnum;
    graphkind kind;
}mgraph;

typedef struct
{
    char adjvex;
    int lowcost;
}closedge[max_ver];

typedef struct
{
    bool b;
    int n;
}msp;
msp p[27][27][27];

int d[27][27];

using namespace std;

int locatevex(mgraph g, char v)
{
    int i;
    for (i = 0; i < g.vexnum; i++)
    {
        if (g.vexs[i] == v) return i;
    }
    return -1;
}

void print(mgraph g)
{
    cout << "输出的最短路径依次为:" << endl;
    int i, j, k, f;
    for (i = 0; i < g.vexnum; i++)
        for (j = 0; j < g.vexnum; j++)
        {
            if (d[i][j] < int_max)
            {
                if (g.vexnum == 3)
                {
                    cout << " 权值:" << setw(3) << d[i][j] <<"  ;";
                    cout << " 边 :" << g.vexs[i];
                    k = 0;
                    while (k < g.vexnum)
                    {
                        if (k != i && k != j && p[i][j][k].b == true)
                        {
                            cout << " -> " << g.vexs[k];
                            break;
                        }
                        k++;
                    }
                    cout << " -> " << g.vexs[j] << endl << endl;
                }
                else
                {
                    f = 0;
                    cout << " 边 :" << g.vexs[i] << "->" << g.vexs[j] << "  " << endl;
                    cout << " 对应的权值: " << setw(4) << d[i][j] << endl;
                    cout << " 经历的各个顶点 : ";
                    for (k = 0; k < g.vexnum; k++)
                    {
                        if (k != i && k != j && p[i][j][k].b == true)
                        {
                            cout << "  " << g.vexs[k];
                            f = 1;
                        }
                    }
                    if (f == 0) cout << "  无";
                    cout << endl << endl;
                } 
            }
        }
}


void createudn(mgraph& g)
{
    char v1, v2;
    int m, i, j, k;
    cout << "请输入图的顶点个数和边数:";
    cin >> g.vexnum >> g.arcnum;
    cout << "请输入各顶点所代表的字符:";
    for (i = 0; i < g.vexnum; i++)
        cin >> g.vexs[i];
    for (i = 0; i < g.vexnum; i++)
        for (j = 0; j < g.vexnum; j++)
            g.arcs[i][j].adj = int_max;
    for (k = 0; k < g.arcnum; k++)
    {
        cout << "请输入起点(字符)和终点(字符)及其对应的边的权值:";
        cin >> v1 >> v2 >> m;
        i = locatevex(g, v1);
        j = locatevex(g, v2);
        g.arcs[i][j].adj = m;
    }
    cout << "图的邻接矩阵为:" << endl;
    for (i = 0; i < g.vexnum; i++)
    {
        for (j = 0; j < g.vexnum; j++)
            cout << setw(9) << g.arcs[i][j].adj << "   ";
        cout << endl;
    }
    return;
}

void floyd(mgraph g)
{
    int i, j, k, l;
    for (i = 0; i < g.vexnum; i++)
        for (j = 0; j < g.vexnum; j++)
        {
            d[i][j] = g.arcs[i][j].adj;
            for (k = 0; k < g.vexnum; k++)
                p[i][j][k].b = false;
            if (d[i][j] < int_max)
            {
                p[i][j][i].b = true;
                p[i][j][j].b = true;
            }
        }

    for (i = 0; i < g.vexnum; i++)
        for (j = 0; j < g.vexnum; j++)
            for (k = 0; k < g.vexnum; k++)
            {
                if (d[j][i] + d[i][k] < d[j][k])
                {
                    d[j][k] = d[j][i] + d[i][k];
                    p[j][k][i].b = true;
                    for (l = 0; l < g.vexnum; l++)
                    {
                        p[j][k][l].b = p[j][i][l].b || p[i][k][l].b;
                    }
                }
            }
}


int main()
{
    mgraph g;
    char u;
    cout << "开始构造有向图" << endl;
    createudn(g);
    cout << endl << "开始运用弗洛里德思想求最短路径" << endl;
    floyd(g);
    print(g);
    return 0;
}

  

posted on 2021-10-14 15:48    阅读(141)  评论(0)    收藏  举报