这个算是图论里面的简单题了,可以用floyd,dijkstra,bfs去做,,只当练手。。 floyd做。。 #include<stdio.h> #include<string.h> #include<stdlib.h> int mat[21][21]; const int INF = 99999; int main(void) { int n,from,to,t; int i,j,k,start=1; while( scanf("%d",&n) != EOF ) { for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) mat[i][j] = INF; while( n-- ) { scanf("%d",&to); mat[1][to] = 1; mat[to][1] = 1; } for( i = 2;i <= 19;i++) { scanf("%d",&n); while( n-- ) { scanf("%d",&to); mat[i][to] = 1; mat[to][i] = 1; } } for( k = 1; k <= 20; k++ ) for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) if( mat[i][j] > mat[i][k] + mat[k][j] ) mat[i][j] = mat[i][k] + mat[k][j]; scanf("%d",&n); printf("Test Set #%d/n",start++); while( n-- ) { scanf("%d%d",&from,&to); printf("%d to %d: %d/n",from,to,mat[from][to]); } printf("/n"); } return 0; } 用dijkstra: #include<stdio.h> #include<string.h> #include<stdlib.h> int mat[21][21]; int flag[21]; int dist[21]; const int INF = 99999999; int main(void) { int n,from,to,min,now; int i,j,k,start=1; while( scanf("%d",&n) != EOF ) { for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) mat[i][j] = INF; while( n-- ) { scanf("%d",&to); mat[1][to] = 1; mat[to][1] = 1; } for( i = 2;i <= 19;i++) { scanf("%d",&n); while( n-- ) { scanf("%d",&to); mat[i][to] = 1; mat[to][i] = 1; } } scanf("%d",&n); printf("Test Set #%d/n",start++); while( n-- ) { scanf("%d%d",&from,&to); for( i = 1;i<=20;i++ ) dist[i]=INF; memset(flag,0,sizeof(flag)); flag[from] = 1;dist[now=from]=0; for( i = 1; i < 20; i++) { for( j = 1; j <= 20; j++ ) if( !flag[j] && dist[j] > dist[now] + mat[now][j] ) dist[j] = dist[now] + mat[now][j]; for( j = 1,min = INF; j <= 20; j++ ) if( !flag[j] && dist[j] < min ) min = dist[now=j]; flag[now]=1; } printf("%d to %d: %d/n",from,to,dist[to]); } printf("/n"); } return 0; } bfs: #include<stdio.h> #include<string.h> #include<stdlib.h> int mat[21][21]; int q[100],flag[21],dist[21]; int front=0,back=0; const int INF = 99999999; int main(void) { int n,from,to; int i,j,t,start=1; while( scanf("%d",&n) != EOF ) { for( i = 1; i <= 20; i++ ) for( j = 1; j <= 20; j++ ) mat[i][j] = INF; while( n-- ) { scanf("%d",&to); mat[1][to] = 1; mat[to][1] = 1; } for( i = 2;i <= 19;i++) { scanf("%d",&n); while( n-- ) { scanf("%d",&to); mat[i][to] = 1; mat[to][i] = 1; } } scanf("%d",&n); printf("Test Set #%d/n",start++); while( n-- ) { scanf("%d%d",&from,&to); front = back = 0; for( i = 1;i<=20;i++ ) flag[i] = 0; q[back++] = from; flag[from] = 1; dist[from] = 0; while( back!=front ) { t = q[front++]; for( i = 1;i <=20;i++) if( !flag[i] && mat[t][i] == 1 ) { dist[i] = dist[t] + 1; flag[i] = 1; q[back++] = i; } } printf("%d to %d: %d/n",from,to,dist[to]); } printf("/n"); } return 0; }