最短路径之Floyed算法

问题描述


给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。


输入格式


第一行两个整数n, m。


接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。


输出格式


共n-1行,第i行表示1号点到i+1号点的最短路。 


样例输入


3 3 
 1 2 -1 
 2 3 -1 
 3 1 2 


样例输出


-1 
 -2 


数据规模与约定


对于10%的数据,n = 2,m = 2。


对于30%的数据,n <= 5,m <= 10。


对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。


注意:用的是 Floyed最短路径方法,该方法要求不能出现负数环。可以出现负权值。但是该方法耗时长。


#include <stdio.h>   
int main()   
{   
   int e[10][10],k,i,j,n,m,t1,t2,t3;   
   int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值   
   //读入n和m,n表示顶点个数,m表示边的条数   
   scanf("%d %d",&n,&m);   
  
    //初始化   
    for(i=1;i<=n;i++)   
 	for(j=1;j<=n;j++)   
     	if(i==j) e[i][j]=0;   
		else e[i][j]=inf;   
    //读入边   
    for(i=1;i<=m;i++)   
    {   
 		scanf("%d %d %d",&t1,&t2,&t3);   
 		e[t1][t2]=t3;   
    }   
  
    //Floyd-Warshall算法核心语句   
    for(k=1;k<=n;k++)   
 		for(i=1;i<=n;i++)   
     		for(j=1;j<=n;j++)   
  				if(e[i][j]>e[i][k]+e[k][j] )   
      				e[i][j]=e[i][k]+e[k][j];   
  
   //输出最终的结果   
   
	     for(j=2;j<=n;j++)   
	 	 {   
	     	printf("%10d\n",e[1][j]);   
	 	 }		    
      
  
    return 0;   
} 


详细内容见  点击打开链接




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值