#2数据点的答案路线为 1 -> n -> 1
所以我做了如下改动:
原 91pts 代码
void sol1(int u){//x为入点,x+n为出点
cout<<st[u-n]<<endl;//从1到n遍历
if(u==2*n){
return;
}
se=u;
for(int i=head[u];i!=0;i=ed[i].nxt){
if(ed[i].w==1){
sol1(ed[i].to+n);
return;
}
}
}
void sol2(int u){
if(u==1){//从n到1遍历
return;
}
for(int i=head[u];i!=0;i=ed[i].nxt){
if(ed[i].w==1&&ed[i].to!=se){
cout<<st[ed[i].to-n]<<endl;
sol2(ed[i].to-n);
return;
}
}
}
......
sol1(n+1),sol2(n);
现 100pts 代码
void sol1(int u){
cout<<st[u-n]<<endl;
if(u==2*n){
return;
}
se=u;
for(int i=head[u];i!=0;i=ed[i].nxt){
if(ed[i].w==1||(ed[i].w==0&&u==n+1&&ed[i].to==n)){//这里
sol1(ed[i].to+n);
return;
}
}
}
void sol2(int u){
if(u==1){
return;
}
for(int i=head[u];i!=0;i=ed[i].nxt){
if(((ed[i].w==1&&ed[i].to!=se)||(ed[i].w==2&&u==n&&ed[i].to==n+1))){//这里
cout<<st[ed[i].to-n]<<endl;
sol2(ed[i].to-n);
return;
}
}
}
......
sol1(n+1),sol2(n);
修改了两处,其他操作无修改