图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。(摘自百度百科)
1.Floyd 弗洛伊德算法
这种算法解决的是多源最短路问题(求任意两点之间的最短路径)
若我们用二维数组e[i][j]表示点i到点j当前的最短距离(程序运行完后数组中存的就是真正的最短距离)
那么我们可以用e[i][j]=max(e[i][j],e[i][k],e[j][k]);来更新e数组。也就是比较 从i到j 和 从i到k+从k到j 的距离
重点来啦!!!
核心思想:能否找到第三点使得任意两点的距离变短,即能否找到 i->k->j 比 i->j 短,如果能找到,就更新。
下面呈上代码:
//多元最短路 Floyd O(n^3) #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=99999999; int n,m,e[1005][1005]; int main() { int i,j,k,a,b,c; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) e[i][j]; else e[i][j]=maxn; } } for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); e[a][b]=c; } //Floyd核心部分 for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) if(e[j][k]>e[j][i]+e[i][k]) e[j][k]=e[j][i]+e[i][k]; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%d ",e[i][j]); printf("\n"); } return 0; }