题意:求图上两点的最短路程,Floyd的模板题,输入的时候是按1-19对应的连接点输入的
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 30; int d[MAXN][MAXN],N,cas; void init(){ memset(d,0x3f3f3f3f,sizeof(d)); for (int i = 1; i <= 20; i++) d[i][i] = 0; } bool read(){ init(); int n,a; if (scanf("%d",&n) == EOF) return 0; for (int i = 0; i < n; i++){ scanf("%d",&a); d[1][a] = 1; d[a][1] = 1; } for (int i = 2; i <= 19; i++){ scanf("%d",&n); for (int j = 0; j < n; j++){ scanf("%d",&a); d[i][a] = 1; d[a][i] = 1; } } return 1; } void Floyd(){ for (int k = 1; k <= 20; k++) for (int i = 1; i <= 20; i++) for (int j = 1; j <= 20; j++) d[i][j] = min(d[i][j],d[i][k]+d[k][j]); } void solve(){ printf("Test Set #%d\n",cas++); scanf("%d",&N); int u,v; while (N--){ scanf("%d%d",&u,&v); printf("%2d to %2d: %d\n",u,v,d[u][v]); } printf("\n"); } int main(){ cas = 1; while (read()){ Floyd(); solve(); } }