foloyd算法

详情看注释

#include <stdio.h>
int main(){
	int m,n,j,i;
	int dp[100][100];//最小距离,dp[i][j],从i到j 
	int lj[100][100];//lj[i][j]表示从从i到j这条最短路径上面,到达j的前一个节点 
	int x,y,l;
	for(i=0;i<100;i++){
		for(j=0;j<100;j++){
			dp[i][j]=99999;//开始默认为99999距离 
			if(i==j)dp[i][j]=0;//自己到自己要走的距离为零 
			if(i==j)lj[i][j]=-1;//自己到自己没有前一个点,用-1来表示 
		}
	}
	scanf("%d",&m);//输入有多少的节点   //1,2......//节点从1开始 
	scanf("%d",&n);//一共有多少条路径 
	for(i=1;i<=n;i++){
		scanf("%d%d%d",&x,&y,&l);//x开始节点  y目的地节点  l两节点之间的距离 
		dp[x][y]=l;//用dp[x][y]来储存数据 
	}
	for(i=1;i<=m;i++){
		for(j=1;j<=m;j++){
			if(dp[i][j]==99999)lj[i][j]=-1;//如果i到j没有路径 
			else{//这里否则就是存在两个节点可以互通,那么i到j就说明i是到达j的前一个节点 
				lj[i][j]=i;
			}
		}
	}
	for(i=1;i<=m;i++){//遍历经过每一个节点 
		for(x=1;x<=m;x++){
			for(y=1;y<=m;y++){
				if(x==y||x==i||y==i)continue;//这里可以自己模拟一下,i表示这里必须要经过的节点,所以如果x或者y以及等于i说明已经经过了i节点,不用再更新,直接continue跳过 
				if((dp[x][i]+dp[i][y])<dp[x][y]){//如果从x到i,在从i到y的距离小于原来的x到y,就更新数据 
					dp[x][y]=dp[x][i]+dp[i][y];
					lj[x][y]=lj[i][y];//x到达y时的前一个节点就是i到达y时的前一个节点 
				}
			}
		}
	}
	for(i=1;i<=m;i++){
		for(j=1;j<=m;j++){
			if(dp[i][j]==99999)dp[i][j]=-1;//这里方便打印,就把没有互通的的节点变成-1 
			printf("%3d",dp[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	for(i=1;i<=m;i++){
		for(j=1;j<=m;j++){
			printf("%3d",lj[i][j]);
		}
		printf("\n");
	}
	int z,a;
	scanf("%d%d",&a,&z);//输入想要查询的道路,a到z 
	int sum=z;//保存最后一个点 
	while(1){
		if(lj[a][z]==-1)break;//如果检测到-1,说明完毕了 
		sum=sum*10+lj[a][z];//保存在sum里面 
		z=lj[a][z];//更新目的带z,变成到达z的上一个节点 
	}
	int sum0=0;
	while(sum){//反转一下sum 
		sum0=sum0*10+sum%10;
		sum/=10;
	}
	printf("%d",sum0);//输出结果 
	return 0;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可不得兼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值