本题原型类似于NOIP2013最短路径,但需要额外输出路径,求如何输出路径

代码:
#include<bits/stdc++.h>
using namespace std;
double f[1005][1005],x[1005],y[1005],w[1005][1005];
int n,b1,b2,k,go[1005],back[1005];
stack<int> ans;
int main(){
cin>>n>>b1>>b2;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
for(int j=1;j<i;j++) w[i][j]=w[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++) f[i][j]=2147483647;
}
f[1][1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j&&i>1) continue;
k=max(i,j)+1;
if(k>n){
if(i==n){
if(f[n][n]>f[i][j]+w[j][n]){
f[n][n]=f[i][j]+w[j][n];
go[n]=j;
}
}
if(j==n){
if(f[n][n]>f[i][j]+w[i][n]){
f[n][n]=f[i][j]+w[i][n];
back[i]=n;
}
}
}
else{
if(k!=b2+1){
if(f[k][j]>f[i][j]+w[i][k]){
f[k][j]=f[i][j]+w[i][k];
go[i]=k;
}
}
if(k!=b1+1){
if(f[i][k]>f[i][j]+w[j][k]){
f[i][k]=f[i][j]+w[j][k];
back[k]=j;
}
}
}
}
}
cout<<fixed<<setprecision(2)<<f[n][n]<<endl;
int t=1;
while(1){
cout<<t-1<<" ";
t=go[t];
if(t==n) break;
}
t=n;
while(t){
cout<<t-1<<" ";
t=back[t];
}
return 0;
}