Muestra de entrada:
输入节点个数,边的个数:
5,5
输入节点a,b及权值:
1,2,1
1,3,5
1,5,10
2,3,20
3,5,3
Genere la longitud de ruta más corta y la ruta más corta
#include <iostream>
using namespace std;
int a[11][11];//邻接矩阵描述
int n, m;//节点个数n,边数m
int dis[11];//存储各节点到顶点1的最短距离
int reach[11];//是否到达过,到达过为1,否则为0
int path[11];//存放最短路径,例如到达顶点8的前一个顶点为path[8]
void Dijstra()
{
for (int i = 2; i <= n; i++)//初始化distance
{
if (a[1][i] != 0)
dis[i] = a[1][i];
else
dis[i] = 99999;
}
path[1] = 1;
for (int i = 2; i <= n; i++) //初始化path
{
if (a[1][i] != 0)
path[i] = 1;
else
path[i] = 0;
}
reach[1] = 1;
for (int i = 1; i <= n; i++)
{
int temp = 99999;
int k = 1;
for (int j = 1; j <= n; j++) //从distance中找出距离最短的一个顶点,并且没有到达过
{
if (reach[j] == 0 && dis[j] < temp)
{
temp = dis[j];
k = j;
}
}
reach[k] = 1;
for (int j = 1; j <= n; j++) //更新distance和path
{
if (reach[j] == 0 && a[k][j] != 0)
if (dis[j] > dis[k] + a[k][j])
{
dis[j] = dis[k] + a[k][j];
path[j] = k;
}
}
}
}
void findminpath(int x)//输出从顶点1到顶点x的最短路径,并输出经过的顶点
{
cout << "从顶点1到达顶点" << x << "的最短路径长度为:" << dis[x] << endl;
int temp[11];
int q = 0;
temp[0] = x;
while (path[x] != 1)//如果没到达起点即顶点1
{
temp[q] = x;
q++;
x = path[x];
}
temp[q] = x;
temp[q + 1] = 1;
cout << "最短路径为:";
for (int i = q + 1; i >= 0; i--)
cout << temp[i];
cout << endl;
}
int main(void)
{
char c;
int x, y, w;
cout << "输入节点个数,边的个数:" << endl;
cin >> n >> c >> m;
cout << "输入节点a,b及权值:" << endl;
for (int i = 1; i <= n; i++)
{
cin >> x >> c >> y >> c >> w;
a[x][y] = a[y][x] = w;
}
Dijstra();
findminpath(n);
}