求最短路,Floyd算法,简单的应用
不过题目真的很晦涩。。。第一个数x表示与第i个数(通俗一点,第i行,其实也是标号为i的点)相邻的点的个数,然后后面有x个值。
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 int g[22][22]; 6 int n; 7 8 bool init() 9 { 10 int num; 11 for(int i = 1;i <= 20;i ++) 12 { 13 for(int j = 1;j <= 20;j ++) 14 { 15 if(i == j) 16 g[i][j] = 0; 17 else 18 g[i][j] = 1000000; 19 } 20 } 21 for(int i = 1 ;i <= 19;i ++) 22 { 23 if(scanf("%d",&num) != 1) 24 return false; 25 for(int j = 0;j < num;j ++) 26 { 27 int a; 28 scanf("%d",&a); 29 g[i][a] = g[a][i] = 1; 30 } 31 } 32 33 return true; 34 } 35 36 void floyd() 37 { 38 for(int i = 1;i <= 20;i ++) 39 { 40 for(int j = 1;j <= 20;j ++) 41 { 42 for(int k = 1;k <= 20;k ++) 43 { 44 g[j][k] = std::min(g[j][k], g[j][i] +g[i][k]); 45 } 46 } 47 } 48 } 49 50 int main() 51 { 52 int cas = 1; 53 while(init()) 54 { 55 floyd(); 56 scanf("%d",&n); 57 int a,b; 58 printf("Test Set #%d\n",cas ++); 59 for(int i = 1;i <= n;i ++) 60 { 61 scanf("%d%d",&a,&b); 62 printf("%2d to %2d: %d\n",a,b,g[a][b]); 63 } 64 printf("\n"); 65 66 } 67 68 return 0; 69 }