分有向图和无向图。算法
有向图很简单:直接建边而后跑\(Floyd\),跑完之后,\(dis(i,i)\)就是通过\(i\)点的最小环的长度。数组
无向图……就是在以\(k\)为中间点扩展以前就把\(k\)拿进去统计spa
像这样:code
for(int k=1;k<=n;k++) { for(int i=1;i<k;i++) for(int j=i+1;j<k;j++) minr=std::min( minr,dis[i][j]+e[i][k]+e[j][k] ); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dis[i][j]=std::min( dis[i][j],dis[i][k]+dis[k][j] ); }
这个挺有意思。class
有这样一个问题:求\(S\)到\(T\)通过\(k\)条边的最短路。扩展
若是\(N\)可以接受\(O(n^3)\)的算法,那么\(Floyd\)就派上用场了。im
若是\(A\)矩阵和\(B\)矩阵分别表示通过\(x\)条边和\(y\)条边的矩阵,那么新的矩阵\(C=A\times B\)就是通过\(x+y\)条边的矩阵。统计
JZ res; for(int i=1;i<=idx_cnt;i++) for(int s=1;s<=idx_cnt;s++) for(int t=1;t<=idx_cnt;t++) res.a[s][t]=std::min( res.a[s][t],a[s][i]+op.a[i][t] ); return res;
和普通的\(Floyd\)算法不一样的是,在这里,等式两边的矩阵是相互独立的。也就是说,\(C\)矩阵中的\(dis\)不会对\(A\)和\(B\)当中的产生影响,因此\(C\)矩阵是切切实实只表示\(x+y\)条边的矩阵。di
而\(Floyd\)算法中,用\(1\)条边的信息统计完\(2\)条边的信息以后,\(2\)条边的信息又要立刻在\(dis\)数组里面用来统计\(3\)条、\(4\)条边的信息,因此不是独立的。co
知道具体含义以后就能够用矩阵快速幂了:-)