El problema de la ruta más corta --- algoritmo de Dijkstra (algoritmo de Dijkstra C ++)

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);
}

Supongo que te gusta

Origin blog.csdn.net/m0_47470899/article/details/110096788
Recomendado
Clasificación