FLoyd算法
适用范围:无负权回路即可,边权可正可负,运行一次算法即可求得任意两点间最短路(多源最短路)。
具体来说:这是是一种dp算法,稠密图效果最佳,对于稠密图,效率要高于执行Dijkstra。时间复杂度为O(N^3),空间复杂度为O(N^2)。
好的博客:最短路径模板+解析——(FLoyd算法)
模板题目:六度分离
#include<stdio.h>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
int n, m, mp[110][110];
int main(){
while( ~scanf("%d%d", &n, &m ) ){
int A, B;
for( int i = 0; i < n; i++ ){
for( int j = 0; j < n; j++ ){
if( i == j ) mp[i][j] = 0;// 自己到自己的距离为 0
else mp[i][j] = INF;
}
}//建立矩阵数组
for( int i = 0; i < m; i++ ){
scanf("%d%d", &A, &B );
mp[A][B] = 1;
mp[B][A] = 1;// 注意这是无向图
}// 完善矩阵
for( int k = 0; k < n; k++ ){
for( int i = 0; i < n; i++ ){
for( int j = 0; j < n; j++ ){
if( mp[i][j] > mp[i][k] + mp[k][j] ){
mp[i][j] = mp[i][k] + mp[k][j];
}
}
}
}
int f = 1;
for( int i = 0; i < n && f; i++ ){
for( int j = 0; j < n && f; j++ ){
if( mp[i][j] - 1 > 6 ){// 注意为什么减 1
f = 0;
printf( "No\n" );
}
}
}
if( f ) printf( "Yes\n" );
}
return 0;
}
核心代码:
for( int k = 0; k < n; k++ ){
for( int i = 0; i < n; i++ ){
for( int j = 0; j < n; j++ ){
if( mp[i][j] >