DP的时候记录一下路径(记录当前点取最大兴趣值时前一个点是哪个点)。注意格式,最后一组数据后面不要有空行。
也可以用最长路来做这道题。
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
void work()
{
bool a[105][105];
int d[105],f[105],last[105],path[105];
int i,j,k,t,m,n,sum,x,y;
sum=0;
memset(a,0,sizeof(a));
memset(d,0,sizeof(d));
memset(f,0,sizeof(f));
memset(last,0,sizeof(last));
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&d[i]);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&x,&y);
if(x<y) a[x][y]=1;
else a[y][x]=1;
}
for(i=2;i<=n+1;i++)
for(j=1;j<i;j++)
if(a[j][i] && d[i]+f[j]>f[i])
{
f[i]=d[i]+f[j];
last[i]=j;
}
k=0;//number of points
i=n+1;
while(last[i])
{
path[++k]=last[i];
i=last[i];
}
path[0]=1;
printf("points : %d\n",f[n+1]);
printf("circuit : ");
for(i=k;i>=0;i--)
printf(i==k?"%d":"->%d",path[i]);
printf("\n");
}
int main()
{
int i,T;
scanf("%d",&T);
for(i=1;i<=T;i++)
{
printf("CASE %d#\n",i);
work();
if(i<T) printf("\n");
}
return 0;
}