pass[k] 存k的前驱
map[i][j] 用力标记 i 到 j 的路可以通过。。
#include<stdio.h>
#include<string.h>
int pass[105];
int judge(int k)
{
while(pass[k]!=k)
{
k=pass[k];
}
if(pass[k]==1)
return 1;
else
return 0;
}
int main()
{
int t,n,point[105],m,map[105][105],i,j,k,v,ans[105],max;
scanf("%d",&t);v=1;
while(t--)
{
if(v>1)
printf("\n");
memset(map,0,sizeof(map));
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&point[i]);
point[n+1]=0;
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&i,&j);
map[i][j]=1;//
}
max=0;
pass[1]=1;
for(i=2;i<=n+1;i++)
{
max=-1;
k=i;
for(j=1;j<i;j++)
{
if(map[j][i]&&point[j]>max&&judge(j))
{k=j;max=point[j];}
}
if(max>-1)
point[i]+=max;
pass[i]=k;
}
printf("CASE %d#\n",v++);
printf("points : %d\n",point[n+1]);
j=0;
k=n+1;ans[j++]=1;
while(pass[k]!=k)
{
ans[j++]=pass[k];
k=pass[k];
}
printf("circuit : ");
for(i=j-1;i>0;i--)
printf("%d->",ans[i]);
printf("%d\n",ans[0]);
}
return 0;
}