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; }