题意:给定 n 个城市的有趣度,并给出可以从那些城市飞到那些城市。其中第一个城市即起始城市同样也作为终点城市,有趣度为 0,旅行途中只允许按有趣度从低到高旅行,问旅行的有趣度最大是多少,并输出旅行路径。

我一开始读题的时候各种深井冰理解错想复杂,导致我一开始甚至认为第一个有趣度 0 代表的是第二个城市,因为第一个城市一定是 0 不需要给出,加上没看到题意里的第一个城市也是第 n + 1 个城市,觉得给出的能旅行的城市里出现了 n + 1 是应该的。还有关于城市联通,我以为给出的联通关系不一定就是按大小排列过后的,然后我还自行按有趣度高低排序之后再放入邻接矩阵。总之就是各种坑爹脑残各种蠢吧……

后来敲完之后各种 WA ,各种比较题解,才发现了各种情况……修修改改 WA 四发之后终于 AC ,输出整个路径我看见大部分题解上用的都是 father 数组,昂,我觉得我还是多珍惜下用栈的机会咯

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<stack>
 5 using namespace std;
 6 
 7 struct city{
 8     int v,l;
 9 }c[101];
10 /*
11 bool cmp(city c1,city c2){
12     return c1.v<c2.v;
13 }
14 */
15 bool g[101][101];
16 int dp[101];
17 
18 int main(){
19     int T;
20     while(scanf("%d",&T)!=EOF){
21         for(int q=1;q<=T;q++){
22             memset(g,0,sizeof(g));
23             memset(dp,0,sizeof(dp));
24             int n,m,i,j;
25             scanf("%d",&n);
26             for(i=1;i<=n;i++){
27                 scanf("%d",&c[i].v);
28                 c[i].l=-1;
29             }
30             c[1].l=1;
31             scanf("%d",&m);
32             for(i=1;i<=m;i++){
33                 int a,b;
34                 scanf("%d%d",&a,&b);
35                 if(b==n+1)g[a][1]=1;
36                 else g[a][b]=1;
37             }
38             int ans=0,t=1;
39         
40             for(i=2;i<=n;i++){
41                 for(j=1;j<i;j++){
42                     if(g[j][i]&&((dp[j]+c[i].v)>dp[i])){
43                         dp[i]=dp[j]+c[i].v;
44                         c[i].l=j;
45                         if(g[i][1]&&dp[i]>ans){
46                             ans=dp[i];
47                             t=i;
48                         }
49                     }
50                 }
51             }
52             printf("CASE %d#\npoints : %d\ncircuit : ",q,ans);
53             stack<int>S;
54             int tmp=t;
55             while(!S.empty()){
56                 S.pop();
57             }
58             S.push(1);
59             while(c[tmp].l!=tmp){
60                 S.push(tmp);
61                 tmp=c[tmp].l;
62             }
63             printf("1");
64             while(!S.empty()){
65                 tmp=S.top();
66                 S.pop();
67                 printf("->%d",tmp);
68             }
69             printf("\n");
70             if(q!=T)printf("\n");
71         }
72     }
73     return 0;
74 }
View Code