hdu1224 dp(dp + 栈/父亲数组记录路径)

时间:2022-09-18 14:29:59

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

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

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

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std; struct city{
int v,l;
}c[];
/*
bool cmp(city c1,city c2){
return c1.v<c2.v;
}
*/
bool g[][];
int dp[]; int main(){
int T;
while(scanf("%d",&T)!=EOF){
for(int q=;q<=T;q++){
memset(g,,sizeof(g));
memset(dp,,sizeof(dp));
int n,m,i,j;
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d",&c[i].v);
c[i].l=-;
}
c[].l=;
scanf("%d",&m);
for(i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
if(b==n+)g[a][]=;
else g[a][b]=;
}
int ans=,t=; for(i=;i<=n;i++){
for(j=;j<i;j++){
if(g[j][i]&&((dp[j]+c[i].v)>dp[i])){
dp[i]=dp[j]+c[i].v;
c[i].l=j;
if(g[i][]&&dp[i]>ans){
ans=dp[i];
t=i;
}
}
}
}
printf("CASE %d#\npoints : %d\ncircuit : ",q,ans);
stack<int>S;
int tmp=t;
while(!S.empty()){
S.pop();
}
S.push();
while(c[tmp].l!=tmp){
S.push(tmp);
tmp=c[tmp].l;
}
printf("");
while(!S.empty()){
tmp=S.top();
S.pop();
printf("->%d",tmp);
}
printf("\n");
if(q!=T)printf("\n");
}
}
return ;
}