floyd 最短路算法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <cstring> #include <cstdio> #include <vector> #define N 25 #define INF 10000 using namespace std; int dp[N][N]; int n,m,a,b; void floyd() { for(int k=1; k<=20; ++k) { for(int i=1; i<=20; ++i) { for(int j=1; j<=20; ++j) { dp[i][j]=min(dp[i][j], dp[i][k]+dp[k][j]); } } } } int main() { int cas=0; while(scanf("%d",&n)==1) { for(int i=0; i<=20; ++i) { for(int j=0; j<=20; ++j) { if(i!=j) dp[i][j]=INF; else dp[i][j]=0; } } for(int i=0; i<n; ++i) { scanf("%d",&a); dp[1][a]=dp[a][1]=1; } for(int i=2; i<20; ++i) { scanf("%d",&n); for(int j=0; j<n; ++j) { scanf("%d",&b); dp[i][b]=dp[b][i]=1; } } floyd(); scanf("%d",&m); printf("Test Set #%d\n",++cas); for(int i=0; i<m; ++i) { scanf("%d %d",&a,&b); printf("%2d to %2d: %d\n",a,b,dp[a][b]); } puts(""); } return 0; }