题意:给出每个城市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 }
代码君

相关文章: