FAFU - 1030 最短距离

本文介绍了一种寻找从起点到终点最短路径的算法,并通过一个具体的实例进行演示。该算法使用邻接矩阵来表示图,并通过动态规划的方法逐步更新各节点到起点的距离,最终输出最短路径的长度。

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

http://acm.fafu.edu.cn/problem.php?id=1030

1.题目:

开车从起始点A到目的地B的路线有多条。给你一张描述待选路线的表(n*n的矩阵A),让你找出行车距离最短的路线。表中表示了任意两个路口的连通情况,以及距离。矩阵元素a(i,j)=0表是路口i,j不连通,a(i,j)!=0表示路口i,j的行车距离。其中起始点A在路口1,目的地B在路口n.


2.代码

#include<iostream>
using namespace std;

int main()
{	//ifstream cin("1030.in");

	int init=1000,j,i,n,k,t,**w,*s,*p,*d;
	
	cin >> n;

	d=new int[n];       
	s=new int[n];
	p=new int[n];
	w=new int*[n];

	for(i=0;i<n;i++)
	{
		w[i]=new int[n];
	} 

	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			cin>>w[i][j];

	for(s[0]=1,i=1;i<n;i++)
	{
		s[i]=0;d[i]=w[0][i];
		if(d[i]<init) p[i]=0;
		else p[i]=-1;
	}

	for(i=1;i<n;i++)
	{
		t=init;
		k=1;

		for(j=1;j<n;j++)
			if((!s[j])&&(d[j]<t)){t=d[j];k=j;}
		s[k]=1;
	
		for (j=1;j<n;j++)
			if((!s[j])&&(d[j]>d[k]+w[k][j])) {
				d[j]=d[k]+w[k][j];
				p[j]=k;
			}
	}

	cout << d[n-1] << endl;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值