HDU 1224 Free DIY Tour
题意:给出每个城市interesting的值,和城市之间的飞行路线,求一条闭合路线(从原点出发又回到原点)
使得路线上的interesting的值之和最大
因为要输出路径,所以用pre数组来保存前驱
在输出路径的时候,我是把前驱一次放在route数组里面,然后再将整个数组反转过来
另外,看别人的题解里面还有一种递归的方法求路径,挺有新意,学习了
我的做法:
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 5100; 9 bool flight[110][110]; 10 int city[110]; 11 int dp[110]; 12 int pre[110]; 13 int route[110]; 14 15 int main(void) 16 { 17 #ifdef LOCAL 18 freopen("1224in.txt", "r", stdin); 19 #endif 20 21 int N, kase; 22 scanf("%d", &N); 23 for(kase = 1; kase <= N; ++kase) 24 { 25 if(kase > 1) printf("\n"); 26 27 int n; 28 scanf("%d", &n); 29 int i; 30 for(i = 1; i <= n; ++i) 31 scanf("%d", &city[i]); 32 city[n + 1] = 0; 33 34 int m, from, to; 35 memset(flight, 0, sizeof(flight)); 36 scanf("%d", &m); 37 for(i = 1; i <= m; ++i) 38 { 39 scanf("%d%d", &from, &to); 40 flight[from][to] = true; 41 } 42 43 memset(dp, 0, sizeof(dp)); 44 memset(pre, 0, sizeof(pre)); 45 int j; 46 for(i = 2; i <= n + 1; ++i) 47 for(j = 1; j < i; ++j) 48 if(flight[j][i] 49 && (dp[j] + city[i]) > dp[i]) 50 { 51 dp[i] = dp[j] + city[i]; 52 pre[i] = j; 53 } 54 55 56 printf("CASE %d#\n", kase); 57 printf("points : %d\n", dp[n + 1]); 58 int p = n + 1, len = 0; 59 while(pre[p] != 0) 60 { 61 route[len++] = pre[p]; 62 p = pre[p]; 63 } 64 for(i = 0; i < len / 2; ++i) 65 { 66 int t = route[i]; 67 route[i] = route[len - i -1]; 68 route[len - i -1] = t; 69 } 70 71 printf("circuit : "); 72 for(i = 0; i < len; ++i) 73 printf("%d->", route[i]); 74 printf("1\n"); 75 } 76 77 return 0; 78 }
别人递归回溯输出路径的做法:
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 5100; 9 bool flight[110][110]; 10 int city[110]; 11 int dp[110]; 12 int pre[110]; 13 int route[110]; 14 15 void putroute(int p) 16 { 17 if(p == 0) 18 return; 19 putroute(pre[p]); 20 printf("%d->", p); 21 } 22 23 int main(void) 24 { 25 #ifdef LOCAL 26 freopen("1224in.txt", "r", stdin); 27 #endif 28 29 int N, kase; 30 scanf("%d", &N); 31 for(kase = 1; kase <= N; ++kase) 32 { 33 if(kase > 1) printf("\n"); 34 35 int n; 36 scanf("%d", &n); 37 int i; 38 for(i = 1; i <= n; ++i) 39 scanf("%d", &city[i]); 40 city[n + 1] = 0; 41 42 int m, from, to; 43 memset(flight, 0, sizeof(flight)); 44 scanf("%d", &m); 45 for(i = 1; i <= m; ++i) 46 { 47 scanf("%d%d", &from, &to); 48 flight[from][to] = true; 49 } 50 51 memset(dp, 0, sizeof(dp)); 52 memset(pre, 0, sizeof(pre)); 53 int j; 54 for(i = 2; i <= n + 1; ++i) 55 for(j = 1; j < i; ++j) 56 if(flight[j][i] 57 && (dp[j] + city[i]) > dp[i]) 58 { 59 dp[i] = dp[j] + city[i]; 60 pre[i] = j; 61 } 62 63 64 printf("CASE %d#\n", kase); 65 printf("points : %d\n", dp[n + 1]); 66 67 printf("circuit : "); 68 putroute(pre[n + 1]); 69 printf("1\n"); 70 } 71 72 return 0; 73 }