题目描述
给出一个图的邻接矩阵,输入顶点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;
}