图最短路径迪杰斯特拉算法

题目描述

给出一个图的邻接矩阵,输入顶点v,用迪杰斯特拉算法求顶点v到其它顶点的最短路径。

注:不允许用STL实现。

输入

 第一行输入t,表示有t个测试实例

第二行输入顶点数n和n个顶点信息

第三行起,每行输入邻接矩阵的一行,以此类推输入n行

第i个结点与其它结点如果相连则为距离,无连接则为0,数据之间用空格

隔开。第四行输入v0,表示求v0到其他顶点的最短路径距离

以此类推输入下一个示例

输出

对每组测试数据,输出:

每行输出v0到某个顶点的最短距离和最短路径

每行格式:v0编号-其他顶点编号-最短路径值----[最短路径]。没有路径输出:v0编号-其他顶点编号--1。具体请参考示范数据

样例输入

2 5 0 1 2 3 4 0 5 0 7 15 0 0 5 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 6 V0 V1 V2 V3 V4 V5 0 0 10 0 30 100 0 0 5 0 0 0 0 0 0 50 0 0 0 0 0 0 0 10 0 0 0 20 0 60 0 0 0 0 0 0 V0

样例输出

0-1-5----[0 1 ] 0-2-9----[0 3 2 ] 0-3-7----[0 3 ] 0-4-10----[0 3 2 4 ] V0-V1--1 V0-V2-10----[V0 V2 ] V0-V3-50----[V0 V4 V3 ] V0-V4-30----[V0 V4 ] V0-V5-60----[V0 V4 V3 V5 ]

#include <iostream>
#include <string>
#define Max 99999
using namespace std;
class Graph
{
    int vexnum;
    int** martix; //邻接矩阵
    string* name;     //存放顶点的名字
    string start;    //开始顶点
    string* Path;    //记录最短路径 字符串组 

public:
    Graph(); //初始化
    void Dijkstra();
};

Graph::Graph(){ //输入构造图 
    cin >> vexnum;
    name = new string[vexnum];
    Path = new string[vexnum];
    martix = new int* [vexnum];
    for (int i = 0; i < vexnum; i++)
    {
        cin >> name[i];
    }
    for (int i = 0; i < vexnum; i++)
    {
        martix[i] = new int[vexnum];
        for (int j = 0; j < vexnum; j++)
        {
            cin >> martix[i][j];
            if (martix[i][j] == 0)
                martix[i][j] = Max;
        }
    }
    cin >> start;
}

void Graph::Dijkstra() {
    int i, j, Current, min;
    bool* Final = new bool[vexnum]; //判断结点是否已找到最短路径
    int* weight = new int[vexnum];    //最小路径的数组
    int index;
    for (int i = 0; i < vexnum; i++)//找到起点所在位置
        if (start == name[i])
            index = i;
    for (int i = 0; i < vexnum; i++) //初始化
    {
        Path[i] = start + " ";
        weight[i] = martix[index][i];
        Final[i] = false;
    }
    weight[index] = 0; //设置起始点 
    Final[index] = true;
    for (i = 0; i < vexnum - 1; i++) //进行n-1轮
    {
        min = Max;
        Current = -1; //初始化current 
        for (j = 0; j < vexnum; j++)
        {
            if (!Final[j] && min > weight[j])
            {
                Current = j;
                min = weight[j];
            }
        }
        if (Current != -1)
        {
            Final[Current] = true;
            Path[Current] += name[Current] + " ";
            for (int q = 0; q < vexnum; q++) //更新路径路径值
            {
                if (!Final[q] && min + martix[Current][q] < weight[q])//判断是否最短
                {
                    weight[q] = min + martix[Current][q];
                    Path[q] = Path[Current];
                }
            }
        }
    }
    for (int i = 1; i < vexnum; i++)
    {
        cout << name[0] << "-" << name[i];
        if (weight[i] >= Max)//若不通 
        {
            cout << "--1" << endl;
            continue;
        }
        cout << "-" << weight[i] << "----[" << Path[i] << "]" << endl;
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        Graph G;
        G.Dijkstra();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值