单源最短路径

本文介绍了一个基于Dijkstra算法实现最短路径查找的C++程序。该程序通过读取文件输入图的数据结构,并允许用户指定起点来计算从该起点到其他所有顶点的最短路径。此外,还展示了如何追踪并打印出这些路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// Experiment 3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
using namespace::std;
#define N 50
#define Max 10000
int matrix[N][N];
int n;
void ShowPath(int p[N], int i, int a) {
	if (i != a)
	{
		if (p[i] != a&&p[i] != 99)
		{
			ShowPath(p, p[i], a);
			cout << p[i] << "-->";
		}
	}
}
void Show2(int dis[],int a,int path[]) {
	for (int i = 0; i < n; i++)
	{
		if (i != a&&dis[i] != 0 && dis[i] != Max) {
			cout << a << "-->";
			ShowPath(path, i, a);
			cout << i << "        " << dis[i] << endl;
		}
		else if(i!=a)
			cout << a << "-->" << i << "         " << "NULL" << endl;
	}
}

void Min(int a) {
	int dis[N] = { 0 };
	int newId=a;
	int newdis=0;
	int mark[N] = { 0 };
	int k;
	int path[N];
	for (int l = 0; l < N; l++)
	{
		path[l] = 99;
	}
	for (int i = 0; i < n; i++)
	{
		dis[i] = matrix[a][i];
	}
	mark[a] = 1;
	for (int i = 0; i < n-1 ; i++)
	{
		k = 0;
		newdis = Max;
		for (int j = 0; j < n; j++)
		{
			if (mark[j] != 1 && dis[j] != 0)
			{
				if (newdis > dis[j])
				{
					newdis = dis[j];
					newId = j;
				}
			}
		}
			if (newdis != Max) {
				dis[newId] = newdis;
				mark[newId] = 1;
			}
		if (i == 0)
		{
			path[newId] = a;
		}
		int temp;
		for (; k < n; k++)
		{
			temp = dis[k];
				if (mark[k]!= 1&&matrix[newId][k]!=0)
				{
					if (dis[k] != 0)
					{
						dis[k] = dis[k] < (dis[newId] + matrix[newId][k]) ? dis[k] : (dis[newId] + matrix[newId][k]);
					}
					else
					{
						dis[k] = dis[newId] + matrix[newId][k];
					}
					if (dis[k] != temp)
					{
						path[k] = newId;
					}
				}
		}
	}
	Show2(dis,a,path);
}
int main()
{
	ifstream in;
	in.open("C:\\Users\\asus\\Documents\\Visual Studio 2017\\Projects\\Experiment 3\\input.txt");
	if (in.fail())
	{
		cout << "ERROR!";
	}
	in >> n;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			in>>matrix[i][j] ;
		}
	}
	int a;
	cout << "Input start point:" << endl;
	cin >> a;
	while (a<n&&a>=0)
	{
		Min(a);
		cout << "Input start point:" << endl;
		cin >> a;
	}
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值