写了一个Floyd-Warshall算法演示

本文详细介绍了Floyd-Warshall算法,一种用于解决图论中多源最短路径问题的有效方法。该算法通过一次标号法动态规划实现,具有简洁高效的特性,适用于寻找任意两点间的最短路径。文中提供了算法的动态转移方程和实现代码。

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

 Floyd-Warshall可以比较高效地解决图论中多源最短路径的问题。它的本质是一次标号法动态规划——正因为如此,这个算法的实现有了非常难能可贵的一点,那就是它的简洁。所以很多人在求最单源短路的时候都会用它,而不是效率更高但实现略烦的Dijkstra或者Bellman-Ford(当然是在时间比较宽裕的时候啦!)。

总之,Floyd-Warshall算法好!来,跟我一起念——Flo-yd-算-法-好!呵呵,功能强大,携带方便,的确是杀人越货之利器呀。

DP的动态转移方程:

Dis[i,j]=w(i,j)  w(i,j)当然就是图里的边权。

Dis[i,j]=min{ Dis[i,k]+Dis[k,j] | i<=k<=j }  简单。。

dis[i,j]表示i和j之间的最短路。

来看看这个演示代码吧。

 

#include<stdio.h>
#define NV 5
#define MA 9999999

int main(void)
{
        
int graph[NV][NV]=
        
{
                MA, 
1728,
                
1, MA, 322,
                
73, MA, 44,
                
224, MA, 3,
                
8243, MA
        }
;
        
int num=NV;
        
int path[NV][NV];
        
int i,j,k;
        
for(i=0;i<num;i++){
                
for(j=0;j<num;j++)
                        printf(
"%d ",graph[i][j]);
                printf(
" ");
        }
system("pause");


        memset(path,
0,sizeof(path));
        
for(i=0;i<num;i++)
                
for(j=0;j<num;j++)
                        path[i][j]
=MA;
        
        
for(i=0;i<num;i++){
                
for(j=0;j<num;j++){
                        path[i][j]
=graph[i][j];
                }

        }

        
for(k=0;k<num;k++)
                
for(i=0;i<num;i++)
                        
for(j=0;j<num;j++)
                                
if(path[i][j]>graph[i][k]+graph[k][j])
                                        path[i][j]
=graph[i][k]+graph[k][j];
        
for(i=0;i<num;i++)
                
for(j=0;j<num;j++)
                        printf(
"Shortest distance between <%d,%d>: %d ",i+1,j+1,path[i][j]);
        system(
"pause");
        
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值