Because there is no weight value, you do not need to use the Floyd algorithm to find the shortest path.
Directly use bfs...
#include<cstdio>#include<cstring>using namespace std;const int maxn = 21;int G[maxn][maxn];int vis[maxn][maxn];struct node{ int level; int u;} q[maxn*maxn];int bfs(int s,int e){ int front = 1; int rear = 1; q[1].u = s; q[1].level = 0; while(front <= rear) { int u = q[front].u; int level = q[front++].level; if(u == e) return level; for(int v = 1; v <= 20; v++) { if(G[u][v] && !vis[u][v]) { vis[u][v] = vis[v][u] = 1; q[++rear].level = level + 1; q[rear].u = v; } } }}int main(){ int begin,T = 0; while(scanf("%d",&begin) != EOF) { T++; memset(G,0,sizeof(G)); int a,num,t; for(int i = 0; i < begin; i++) { scanf("%d",&a); G[1][a] = G[a][1] = 1; } for(int i = 1; i < 19; i++) { scanf("%d",&num); for(int j = 0; j < num; j++) { scanf("%d",&a); G[i+1][a] = G[a][i+1] = 1; } } printf("Test Set #%d\n",T); scanf("%d",&t); int s,e; for(int i = 0; i < t; i++) { memset(vis,0,sizeof(vis)); scanf("%d%d",&s,&e); printf("%2d to %2d: %d\n",s,e,bfs(s,e)); } printf("\n"); } return 0;}