最短路问题(short-path problem)是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。基本内容是:若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。(摘自百度百科)
常见的最短路算法有floyd,dijkstra和spfa。
1.floyd
floyd可以说是最暴力的最短路求法了,但其实floyd是用的动态规划的思想,只不过floyd可以求出任意2点之间的最短路,所以时间复杂度O(n^3)。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int a[110][110]; 6 int x,y,v; 7 int main() 8 { 9 int n,m;//n个点,m条边 10 memset(a,127/3,sizeof(a)); 11 for(int i=1;i<=m;++i) 12 { 13 scanf("%d%d%d",&x,&y,&v); 14 a[x][y]=a[y][x]=v;//双向边 15 } 16 for(int k=1;k<=n;++k) 17 for(int i=1;i<=n;++i) 18 for(int j=1;j<=n;++j) 19 a[i][j]=min(a[i][k]+a[k][j],a[i][j]);//松弛操作 20 printf("%d",a[1][n]); 21 return 0; 22 }