隔了一年零三个月,重新刷URAL,这题挺麻烦的输出路径。输出路径挺扯的,乱写了写乱改改就A了。。。我本来想用很靠谱,记录每一条路径的,然后输出最小的,结果Tle,然后我使劲水水又过了一组,发现别人的题解。。直接来了一次 就过了。。我乱搞了搞,倒着记录最小的,然后倒着输出,就过了。。。
1 #include <cstring> 2 #include <cstdio> 3 #include <string> 4 #include <iostream> 5 #include <algorithm> 6 #include <vector> 7 #include <queue> 8 using namespace std; 9 #define INF 10000000 10 int dp[901][8101]; 11 int pre[901][8101]; 12 int s[1010]; 13 struct node 14 { 15 int a,b; 16 }; 17 void spfa() 18 { 19 int i,a,b; 20 queue<node> que; 21 node temp,u,v; 22 for(i = 1; i < 10; i ++) 23 { 24 temp.a = i; 25 temp.b = i*i; 26 dp[i][i*i] = 1; 27 pre[i][i*i] = i; 28 que.push(temp); 29 } 30 while(!que.empty()) 31 { 32 u = que.front(); 33 a = u.a; 34 b = u.b; 35 que.pop(); 36 if(a > 900) continue; 37 if(b > 8100) continue; 38 for(i = 1; i < 10; i ++) 39 { 40 v.a = i+a; 41 v.b = i*i+b; 42 if(i + a > 900) continue; 43 if(i*i + b > 8100) continue; 44 if(dp[v.a][v.b] > dp[u.a][u.b] + 1) 45 { 46 pre[v.a][v.b] = i; 47 dp[v.a][v.b] = dp[u.a][u.b] + 1; 48 que.push(v); 49 } 50 } 51 } 52 return ; 53 } 54 55 int main() 56 { 57 int t,n,m,i,j; 58 int top; 59 for(i = 1; i <= 900; i ++) 60 { 61 for(j = 1; j <= 8100; j ++) 62 { 63 dp[i][j] = INF; 64 pre[i][j] = INF; 65 } 66 } 67 spfa(); 68 scanf("%d",&t); 69 top = 0; 70 while(t--) 71 { 72 scanf("%d%d",&n,&m); 73 if(n > 900||m > 8100) 74 { 75 printf("No solution "); 76 continue; 77 } 78 else if(dp[n][m] > 100) 79 { 80 printf("No solution "); 81 continue; 82 } 83 int top = 0; 84 while(n&&m) 85 { 86 i = pre[n][m]; 87 s[top++] = i; 88 n = n - i; 89 m = m - i*i; 90 } 91 for(i = top-1;i >= 0;i --) 92 printf("%d",s[i]); 93 printf(" "); 94 } 95 return 0; 96 }