0
点赞
收藏
分享

微信扫一扫

DS图—图的最短路径(不含代码框架)

萧让听雪 2022-01-13 阅读 21
数据结构
#include<bits/stdc++.h>
#define Max 99999
using namespace std;
class Graph
{
    int ver_num;
    int **adjacency; //邻接矩阵
    string *ver;     //存放顶点的名字
    string start;    //开始顶点
    string *Path;    //最短路径的字符串记录

public:
    Graph() //初始化
    {
        cin >> ver_num;
        ver = new string[ver_num];
        Path = new string[ver_num];
        for (int i = 0; i < ver_num; i++)
        {
            cin >> ver[i];
            adjacency = new int *[ver_num];
        }
        for (int i = 0; i < ver_num; i++)
        {
            adjacency[i] = new int[ver_num];
            for (int j = 0; j < ver_num; j++)
            {
                cin >> adjacency[i][j];
                if (adjacency[i][j] == 0)
                    adjacency[i][j] = Max;
            }
        }
        cin >> start;
    }

    int Index(string a) //寻找字符串a在ver中的下标
    {
        for (int i = 0; i < ver_num; i++)
            if (a == ver[i])
                return i;
        return -1;
    }

    void Dijkstra()
    {
        int i, j, Current, min;
        bool *Final = new bool[ver_num]; //判断结点是否已找到最短路径
        int *Dest = new int[ver_num];    //最小路径的数组
        int index = Index(start);
        for (int i = 0; i < ver_num; i++) //初始化
        {
            Path[i] = start + " ";
            Dest[i] = adjacency[index][i];
            Final[i] = false;
        }
        Dest[index] = 0; //初始点最短路径为0 且已找到最短路径
        Final[index] = true;
        for (i = 0; i < ver_num - 1; i++) //进行n-1轮
        {
            min = Max;
            Current = -1; //在Dest中未找到最短路径的顶点中路径最短顶点的下标
            for (j = 0; j < ver_num; j++)
            {
                if (Final[j] == false && min > Dest[j])
                {
                    Current = j;
                    min = Dest[j];
                }
            }
            if (Current != -1)
            {
                Final[Current] = true;
                Path[Current] += ver[Current] + " ";
                for (int q = 0; q < ver_num; q++) //松弛
                {
                    if (Final[q] == false && min + adjacency[Current][q] < Dest[q])
                    {
                        Dest[q] = min + adjacency[Current][q];
                        Path[q] = Path[Current];
                    }
                }
            }
        }
        for (int i = 1; i < ver_num; i++)
        {
            cout << ver[0] << "-" << ver[i];
            if (Dest[i] >= Max)
            {
                cout << "--1" << endl;
                continue;
            }
            cout << "-" << Dest[i] << "----[" << Path[i] << "]" << endl;
        }
    }
};

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        Graph MyGraph;
        MyGraph.Dijkstra();
    }
    return 0;
}

举报

相关推荐

0 条评论