最短路径-弗洛伊德算法


void SchoolMap::FindRoad(int a, int b, int &StepNUM, int &Dis,int Step[])
{
	int D[11][11], Path[11][11], i, j, k; 
	for (int i = 0; i<BudingNUM; ++i)
		for (int j = 0; j<BudingNUM; ++j)
		{
			if (i == j)
			{
				D[i][j] = 0; Path[i][j] = 0;
			}
			else
			{
				D[i][j] = Road[i][j];
				if (D[i][j] < 999) {
					Path[i][j] = j;
				}
				else    Path[i][j] = -1;
			}
		}
	for (int k = 0; k < BudingNUM; ++k)
	{
		for (int i = 0; i < BudingNUM; ++i)
		{
			for (int j = 0; j < BudingNUM; ++j)
			{
				if(D[i][j]>(D[i][k]+D[k][j]))  
				{
					D[i][j] = D[i][k] + D[k][j];
					Path[i][j] = Path[i][k];  
                                }
			}
		}
		Dis = D[a][b];
	}
	Budings[a].ShowName();
	while (a != b)
	{ 
		 cout << "-";
		 Budings[Path[a][b]].ShowName();
		 a = Path[a][b];
	}
	cout << endl;
	
}

我认为这个算法最重要的地方在于Path 保存点的那一处:

例如我走的是0-5这条路线 压经过0-3和3-5最短 而0-3又要经过0-1和1-3最短 那么用Path保存 当只允许走1号顶点的时候(k=1)时候 Path[i][j] = Path[i][k];将Path[i][k];这个值保存 k=1时 这个值为1 因此0-3=1 当走0-5的时候在3号顶点的时候(k=3)时Path[0][5]=Path[0][3] 而Path[0][3]的值正好是必须经过0-1时候的赋值 以此类推 Path就很好的保存了走这条路线每一条最短的必经路线将其值从底传至顶部保存下来 下一次访问 通过a = Path[a][b];如果a-b之间还有最短路径 那么其中必然存在传上来的值 会走那条路线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值